#include <iostream> #include <queue> #include <stack> using namespace std; int n,l_kolorow,m; struct dane{ int masa; long long cena; }; bool operator<(dane a,dane b) { return a.cena > b.cena; } struct dfs{ int i,masa; long long cena; }; int main() { ios_base::sync_with_stdio(0); cin >> n >> l_kolorow >> m; vector<vector<dane>> zelki(l_kolorow); vector<long long> stopnie(m+1,-1); for(int i = 0;i<n;i++) { int kolor; dane x; cin >> kolor >> x.masa >> x.cena; zelki[kolor-1].push_back(x); if(kolor==1) { if(stopnie[x.masa] == -1) stopnie[x.masa] = x.cena; stopnie[x.masa] = min(stopnie[x.masa],x.cena); } } for(int i = 1;i<l_kolorow;i++) { vector<long long> nowe(m+1,-1); for(int j = 1;j<=m;j++) if(stopnie[j]!=-1) for(dane y : zelki[i]) if(stopnie[j] + y.cena < nowe[(j + y.masa)%m] || nowe[(j + y.masa)%m] == -1) nowe[(j + y.masa)%m] = stopnie[j] + y.cena; swap(stopnie,nowe); } priority_queue<dane> kolej; vector<int> niepuste; kolej.push({0,0}); for(int i = 1;i<=m;i++) if(stopnie[i] != -1) kolej.push({i,stopnie[i]}); vector<long long> wyn(m,-1); while(!kolej.empty()) { dane x = kolej.top(); kolej.pop(); if(wyn[x.masa]!=-1) continue; wyn[x.masa]=x.cena; niepuste.push_back(x.masa); for(int y : niepuste) if(wyn[(x.masa + y)%m]==-1) kolej.push({(x.masa + y)%m,x.cena + wyn[y]}); } for(long long x : wyn) cout << x << "\n"; }
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <iostream> #include <queue> #include <stack> using namespace std; int n,l_kolorow,m; struct dane{ int masa; long long cena; }; bool operator<(dane a,dane b) { return a.cena > b.cena; } struct dfs{ int i,masa; long long cena; }; int main() { ios_base::sync_with_stdio(0); cin >> n >> l_kolorow >> m; vector<vector<dane>> zelki(l_kolorow); vector<long long> stopnie(m+1,-1); for(int i = 0;i<n;i++) { int kolor; dane x; cin >> kolor >> x.masa >> x.cena; zelki[kolor-1].push_back(x); if(kolor==1) { if(stopnie[x.masa] == -1) stopnie[x.masa] = x.cena; stopnie[x.masa] = min(stopnie[x.masa],x.cena); } } for(int i = 1;i<l_kolorow;i++) { vector<long long> nowe(m+1,-1); for(int j = 1;j<=m;j++) if(stopnie[j]!=-1) for(dane y : zelki[i]) if(stopnie[j] + y.cena < nowe[(j + y.masa)%m] || nowe[(j + y.masa)%m] == -1) nowe[(j + y.masa)%m] = stopnie[j] + y.cena; swap(stopnie,nowe); } priority_queue<dane> kolej; vector<int> niepuste; kolej.push({0,0}); for(int i = 1;i<=m;i++) if(stopnie[i] != -1) kolej.push({i,stopnie[i]}); vector<long long> wyn(m,-1); while(!kolej.empty()) { dane x = kolej.top(); kolej.pop(); if(wyn[x.masa]!=-1) continue; wyn[x.masa]=x.cena; niepuste.push_back(x.masa); for(int y : niepuste) if(wyn[(x.masa + y)%m]==-1) kolej.push({(x.masa + y)%m,x.cena + wyn[y]}); } for(long long x : wyn) cout << x << "\n"; } |