#include <bits/stdc++.h> #define FOR(i, a, b) for(int i =(a); i < (b); ++i) #define re(i, n) FOR(i, 1, n) #define ford(i, a, b) for(int i = (a); i >= (b); --i) #define rep(i, n) for(int i = 0;i <(n); ++i) #define all(x) (x).begin(), (x).end() #define sz(x) (int) (x).size() using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pii; typedef vector<ll> vll; typedef vector<int> vi; typedef vector<pll> vpll; typedef vector<pii> vpii; const ll inf = 1e18; const int N = 7002; int n,k,m; vector<vpll> col; ll dp1[N][N]; //najmniejszy koszt przejscia o +j uzywajac pierwszych i kolorow ll edge[N]; ll dist[N]; bool vis[N]; ll mod_sub(ll a, ll b) { return a - b < 0 ? a - b + m : a - b; } ll mod_add(ll a, ll b) { return a + b >= m ? a + b - m : a + b; } void dijkstra(int s) { dist[s] = 0; rep(i, m) { ll v = -1; ll d = inf; rep(j, m) { if (!vis[j] && (v == -1 || d > dist[j])) { d = dist[j]; v = j; } } if (d >= inf) return; vis[v] = true; for (int i = 1; i < m; i++) { ll u = mod_add(v, i); ll nd = d + edge[i]; if (dist[u] > nd) { dist[u] = nd; } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> m; col.resize(k); rep(i, k+1) { rep(j, m) { dp1[i][j] = inf; } } dp1[0][0] = 0; rep(i, n) { ll ki, mi, ci; cin >> ki >> mi >> ci; ki--; col[ki].push_back({ci, mi}); } for (int i = 1; i <= k; i++) { for (pll v : col[i-1]) { ll ci = v.first; ll mi = v.second; for (int j = 0; j < m; j++) { dp1[i][j] = min(dp1[i][j], dp1[i-1][mod_sub(j, mi)] + ci); } } } rep(i, m) edge[i] = dp1[k][i]; rep(i, m) dist[i] = inf; dijkstra(0); rep(i, m) { if (dist[i] < inf) cout << dist[i] << '\n'; else cout << "-1\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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <bits/stdc++.h> #define FOR(i, a, b) for(int i =(a); i < (b); ++i) #define re(i, n) FOR(i, 1, n) #define ford(i, a, b) for(int i = (a); i >= (b); --i) #define rep(i, n) for(int i = 0;i <(n); ++i) #define all(x) (x).begin(), (x).end() #define sz(x) (int) (x).size() using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pii; typedef vector<ll> vll; typedef vector<int> vi; typedef vector<pll> vpll; typedef vector<pii> vpii; const ll inf = 1e18; const int N = 7002; int n,k,m; vector<vpll> col; ll dp1[N][N]; //najmniejszy koszt przejscia o +j uzywajac pierwszych i kolorow ll edge[N]; ll dist[N]; bool vis[N]; ll mod_sub(ll a, ll b) { return a - b < 0 ? a - b + m : a - b; } ll mod_add(ll a, ll b) { return a + b >= m ? a + b - m : a + b; } void dijkstra(int s) { dist[s] = 0; rep(i, m) { ll v = -1; ll d = inf; rep(j, m) { if (!vis[j] && (v == -1 || d > dist[j])) { d = dist[j]; v = j; } } if (d >= inf) return; vis[v] = true; for (int i = 1; i < m; i++) { ll u = mod_add(v, i); ll nd = d + edge[i]; if (dist[u] > nd) { dist[u] = nd; } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> m; col.resize(k); rep(i, k+1) { rep(j, m) { dp1[i][j] = inf; } } dp1[0][0] = 0; rep(i, n) { ll ki, mi, ci; cin >> ki >> mi >> ci; ki--; col[ki].push_back({ci, mi}); } for (int i = 1; i <= k; i++) { for (pll v : col[i-1]) { ll ci = v.first; ll mi = v.second; for (int j = 0; j < m; j++) { dp1[i][j] = min(dp1[i][j], dp1[i-1][mod_sub(j, mi)] + ci); } } } rep(i, m) edge[i] = dp1[k][i]; rep(i, m) dist[i] = inf; dijkstra(0); rep(i, m) { if (dist[i] < inf) cout << dist[i] << '\n'; else cout << "-1\n"; } } |