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