#include<iostream> #include<vector> #include<queue> using namespace std; typedef long long ll; vector< pair<int,ll> >mm[7010]; vector< pair<ll,int> >v; ll dp1[7010][2]; ll dp2[7010]; priority_queue< pair<ll,int> >pq;//koszt, indeks ll m; void dijkstra(){ ll a,b; dp2[0]=0; for(int i=0;i<v.size();i++)pq.push(v[i]); while(!pq.empty()){ a=pq.top().second; b=-pq.top().first; pq.pop(); // cout<<a<<' '<<b<<endl; if(dp2[a]<b)continue; dp2[a]=b; for(int i=0;i<v.size();i++){ if(dp2[(a+v[i].second)%m]>b-v[i].first){ dp2[(a+v[i].second)%m]=b-v[i].first; pq.push({-b+v[i].first,(a+v[i].second)%m}); } } } return; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,k,kt=0,v1,v2,v3; cin>>n>>k>>m; for(int i=0;i<n;i++){ cin>>v1>>v2>>v3; mm[v1].push_back({v2,v3}); } for(int i=0;i<m;i++)dp1[i][kt^1]=1000000000000000000; dp1[0][kt^1]=0; for(int ii=1;ii<=k;ii++){ for(int i=0;i<m;i++)dp1[i][kt]=1000000000000000000; for(int i=0;i<mm[ii].size();i++){ for(int j=0;j<m;j++){ dp1[j][kt]=min(dp1[j][kt],dp1[(j-mm[ii][i].first+m)%m][kt^1]+mm[ii][i].second); } } // for(int j=0;j<m;j++){ // cout<<dp1[j][kt]<<' ';//=min(dp1[j][kt],dp1[(j-it->second[i].first+m)%m][kt^1]+it->second[i].second); // } // cout<<'\n'; kt=(kt+1)%2; } dp1[0][kt^1]=0; for(int i=0;i<m;i++){ dp2[i]=1000000000000000000; // cout<<dp1[i][kt^1]<<' '; if(dp1[i][kt^1]<1000000000000000000)v.push_back({-dp1[i][kt^1],i}); } // cout<<'\n'; dijkstra(); for(int i=0;i<m;i++){ if(dp2[i]<1000000000000000000)cout<<dp2[i]<<'\n'; else cout<<-1<<'\n'; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<iostream> #include<vector> #include<queue> using namespace std; typedef long long ll; vector< pair<int,ll> >mm[7010]; vector< pair<ll,int> >v; ll dp1[7010][2]; ll dp2[7010]; priority_queue< pair<ll,int> >pq;//koszt, indeks ll m; void dijkstra(){ ll a,b; dp2[0]=0; for(int i=0;i<v.size();i++)pq.push(v[i]); while(!pq.empty()){ a=pq.top().second; b=-pq.top().first; pq.pop(); // cout<<a<<' '<<b<<endl; if(dp2[a]<b)continue; dp2[a]=b; for(int i=0;i<v.size();i++){ if(dp2[(a+v[i].second)%m]>b-v[i].first){ dp2[(a+v[i].second)%m]=b-v[i].first; pq.push({-b+v[i].first,(a+v[i].second)%m}); } } } return; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,k,kt=0,v1,v2,v3; cin>>n>>k>>m; for(int i=0;i<n;i++){ cin>>v1>>v2>>v3; mm[v1].push_back({v2,v3}); } for(int i=0;i<m;i++)dp1[i][kt^1]=1000000000000000000; dp1[0][kt^1]=0; for(int ii=1;ii<=k;ii++){ for(int i=0;i<m;i++)dp1[i][kt]=1000000000000000000; for(int i=0;i<mm[ii].size();i++){ for(int j=0;j<m;j++){ dp1[j][kt]=min(dp1[j][kt],dp1[(j-mm[ii][i].first+m)%m][kt^1]+mm[ii][i].second); } } // for(int j=0;j<m;j++){ // cout<<dp1[j][kt]<<' ';//=min(dp1[j][kt],dp1[(j-it->second[i].first+m)%m][kt^1]+it->second[i].second); // } // cout<<'\n'; kt=(kt+1)%2; } dp1[0][kt^1]=0; for(int i=0;i<m;i++){ dp2[i]=1000000000000000000; // cout<<dp1[i][kt^1]<<' '; if(dp1[i][kt^1]<1000000000000000000)v.push_back({-dp1[i][kt^1],i}); } // cout<<'\n'; dijkstra(); for(int i=0;i<m;i++){ if(dp2[i]<1000000000000000000)cout<<dp2[i]<<'\n'; else cout<<-1<<'\n'; } return 0; } |