#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; } |
English