#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <set>
#define st first
#define nd second
typedef long long ll;
using namespace std;
struct zelek {
ll color;
ll mass;
ll cost;
};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, k, m; cin >> n >> k >> m;
vector<zelek> zelki(n);
for (int i = 0; i < n; i++) {
ll a, b, c;
cin >> a >> b >> c;
zelki[i] = {a, b, c};
}
for (int i = 1; i <= k; i++) {
zelek e = {i, 0, (ll)1e18};
zelki.push_back(e);
}
sort(zelki.begin(), zelki.end(), [](zelek a, zelek b){
if (a.color != b.color) return a.color < b.color;
if (a.mass != b.mass) return a.mass < b.mass;
return a.cost < b.cost;
});
vector<ll> edges(m, 1e18), e2(m, 1e18);
edges[0] = 0;
int curcol = 1;
for (auto z: zelki) {
if (z.color != curcol) {
edges = e2;
e2 = vector<ll>(m, 1e18);
curcol++;
// if (curcol != z.color) break;
}
for (int i = 0; i < m; i++) {
e2[(i+z.mass)%m] = min(e2[(i+z.mass)%m], edges[i]+z.cost);
}
}
edges = e2;
vector<ll> d(m, 1e18);
d[0] = 0;
set<pair<ll, int>> s;
s.insert({0, 0});
while (!s.empty()) {
int u = (*s.begin()).nd;
s.erase(s.begin());
for (int i = 1; i < m; i++) {
int v = (u+i)%m;
if (d[v] > d[u] + edges[i]) {
s.erase({d[v],v});
d[v] = d[u] + edges[i];
s.insert({d[v],v});
}
}
}
for (int i = 0; i < m; i++) {
if (d[i] == 1e18) cout << "-1\n";
else cout << d[i] << '\n';
}
// for (int i = 0; i < m; i++) cout << edges[i] << '\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 | #include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <set> #define st first #define nd second typedef long long ll; using namespace std; struct zelek { ll color; ll mass; ll cost; }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, k, m; cin >> n >> k >> m; vector<zelek> zelki(n); for (int i = 0; i < n; i++) { ll a, b, c; cin >> a >> b >> c; zelki[i] = {a, b, c}; } for (int i = 1; i <= k; i++) { zelek e = {i, 0, (ll)1e18}; zelki.push_back(e); } sort(zelki.begin(), zelki.end(), [](zelek a, zelek b){ if (a.color != b.color) return a.color < b.color; if (a.mass != b.mass) return a.mass < b.mass; return a.cost < b.cost; }); vector<ll> edges(m, 1e18), e2(m, 1e18); edges[0] = 0; int curcol = 1; for (auto z: zelki) { if (z.color != curcol) { edges = e2; e2 = vector<ll>(m, 1e18); curcol++; // if (curcol != z.color) break; } for (int i = 0; i < m; i++) { e2[(i+z.mass)%m] = min(e2[(i+z.mass)%m], edges[i]+z.cost); } } edges = e2; vector<ll> d(m, 1e18); d[0] = 0; set<pair<ll, int>> s; s.insert({0, 0}); while (!s.empty()) { int u = (*s.begin()).nd; s.erase(s.begin()); for (int i = 1; i < m; i++) { int v = (u+i)%m; if (d[v] > d[u] + edges[i]) { s.erase({d[v],v}); d[v] = d[u] + edges[i]; s.insert({d[v],v}); } } } for (int i = 0; i < m; i++) { if (d[i] == 1e18) cout << "-1\n"; else cout << d[i] << '\n'; } // for (int i = 0; i < m; i++) cout << edges[i] << '\n'; } |
English