#include <bits/stdc++.h>
using namespace std;
typedef pair<long long,int> pli;
const int MX=7070;
int k,n,m,x,y,z;
long long f[2][MX];
vector<pli> v[MX],steps;
int main() {
scanf("%d%d%d",&k,&n,&m);
for (int i=0; i<k; i++) {
scanf("%d%d%d",&x,&y,&z);
v[x].emplace_back(z,y%m);
}
memset(f,120,sizeof(f));
long long inf=f[0][0];
f[0][0]=0;
for (int i=1; i<=n; i++) {
int cur=(i&1);
int prv=(cur^1);
memset(f[cur],120,sizeof(f[cur]));
for (int j=0; j<m; j++) if (f[prv][j]<inf)
for (int k=0; k<v[i].size(); k++) {
int nxt=j+v[i][k].second;
if (nxt>=m) nxt-=m;
f[cur][nxt]=min(f[cur][nxt],f[prv][j]+v[i][k].first);
}
}
int lst=(n&1);
f[lst][0]=0;
priority_queue<pli,vector<pli>,greater<pli>> q;
for (int i=1; i<m; i++) if (f[lst][i]<inf) {
steps.emplace_back(f[lst][i],i);
q.push({f[lst][i],i});
}
while (!q.empty()) {
long long dst=q.top().first;
int i=q.top().second;
q.pop();
if (f[lst][i]!=dst) continue;
for (int j=0; j<steps.size(); j++) {
long long cost=dst+steps[j].first;
int nxt=i+steps[j].second;
if (nxt>=m) nxt-=m;
if (cost<f[lst][nxt]) {
f[lst][nxt]=cost;
q.push({cost,nxt});
}
}
}
for (int i=0; i<m; i++) printf("%lld\n",(f[lst][i]<inf)?f[lst][i]:-1LL);
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 | #include <bits/stdc++.h> using namespace std; typedef pair<long long,int> pli; const int MX=7070; int k,n,m,x,y,z; long long f[2][MX]; vector<pli> v[MX],steps; int main() { scanf("%d%d%d",&k,&n,&m); for (int i=0; i<k; i++) { scanf("%d%d%d",&x,&y,&z); v[x].emplace_back(z,y%m); } memset(f,120,sizeof(f)); long long inf=f[0][0]; f[0][0]=0; for (int i=1; i<=n; i++) { int cur=(i&1); int prv=(cur^1); memset(f[cur],120,sizeof(f[cur])); for (int j=0; j<m; j++) if (f[prv][j]<inf) for (int k=0; k<v[i].size(); k++) { int nxt=j+v[i][k].second; if (nxt>=m) nxt-=m; f[cur][nxt]=min(f[cur][nxt],f[prv][j]+v[i][k].first); } } int lst=(n&1); f[lst][0]=0; priority_queue<pli,vector<pli>,greater<pli>> q; for (int i=1; i<m; i++) if (f[lst][i]<inf) { steps.emplace_back(f[lst][i],i); q.push({f[lst][i],i}); } while (!q.empty()) { long long dst=q.top().first; int i=q.top().second; q.pop(); if (f[lst][i]!=dst) continue; for (int j=0; j<steps.size(); j++) { long long cost=dst+steps[j].first; int nxt=i+steps[j].second; if (nxt>=m) nxt-=m; if (cost<f[lst][nxt]) { f[lst][nxt]=cost; q.push({cost,nxt}); } } } for (int i=0; i<m; i++) printf("%lld\n",(f[lst][i]<inf)?f[lst][i]:-1LL); return 0; } |
English