#include <bits/stdc++.h> #define ll long long using namespace std; ll argmin(vector<ll>& answer){ ll x = LONG_LONG_MAX, in2dex = 0; for(ll i=0; i<answer.size(); i++) if(answer[i] < x){ x = answer[i]; in2dex = i; } return in2dex; } int main(){ ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); ll n, col, m; cin>>n>>col>>m; //--------------------- vector<vector<pair<ll, ll>>> data(col); for(ll i=0; i<n; i++){ ll colour, weight, cost; cin>>colour>>weight>>cost; data[colour-1].push_back({weight, cost}); } //--------------------- for(auto k: data){ if(k.size() == 0){ cout<<"0\n"; m--; while(m--){ cout<<"-1\n"; } return 0; } } //--------------------- vector<ll> answer(m, LONG_LONG_MAX), result(m, LONG_LONG_MAX), new_result(m, LONG_LONG_MAX); for(auto k: data[0]) result[k.first % m] = min(result[k.first % m], k.second); for(ll i=1; i<col; i++){ new_result.assign(m, LONG_LONG_MAX); for(auto k: data[i]){ for(ll j=0; j<m; j++){ if(result[j] == LONG_LONG_MAX) continue; new_result[(k.first + j) % m] = min(new_result[(k.first + j) % m], result[j] + k.second); } } swap(result, new_result); } for(ll i=0; i<m; i++) answer[i] = min(answer[i], result[i]); ll opennodes = 0, donenodes = 0; for(auto k: answer) if(k != LONG_LONG_MAX) opennodes++; vector<ll> d(m, LONG_LONG_MAX); while(true){ ll v = argmin(answer); if(answer[v] == LONG_LONG_MAX) break; d[v] = answer[v]; donenodes++; for(ll i=0; i<m; i++){ if(d[(v + i) % m] == LONG_LONG_MAX && d[i] != LONG_LONG_MAX){ if(answer[(v + i) % m] == LONG_LONG_MAX) opennodes++; answer[(v + i) % m] = min(answer[(v + i) % m], d[v] + d[i]); } } answer[v] = LONG_LONG_MAX; } //--------------------- d[0] = 0; for(auto k: d) if(k != LONG_LONG_MAX) cout<<k<<'\n'; else cout<<"-1\n"; 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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <bits/stdc++.h> #define ll long long using namespace std; ll argmin(vector<ll>& answer){ ll x = LONG_LONG_MAX, in2dex = 0; for(ll i=0; i<answer.size(); i++) if(answer[i] < x){ x = answer[i]; in2dex = i; } return in2dex; } int main(){ ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); ll n, col, m; cin>>n>>col>>m; //--------------------- vector<vector<pair<ll, ll>>> data(col); for(ll i=0; i<n; i++){ ll colour, weight, cost; cin>>colour>>weight>>cost; data[colour-1].push_back({weight, cost}); } //--------------------- for(auto k: data){ if(k.size() == 0){ cout<<"0\n"; m--; while(m--){ cout<<"-1\n"; } return 0; } } //--------------------- vector<ll> answer(m, LONG_LONG_MAX), result(m, LONG_LONG_MAX), new_result(m, LONG_LONG_MAX); for(auto k: data[0]) result[k.first % m] = min(result[k.first % m], k.second); for(ll i=1; i<col; i++){ new_result.assign(m, LONG_LONG_MAX); for(auto k: data[i]){ for(ll j=0; j<m; j++){ if(result[j] == LONG_LONG_MAX) continue; new_result[(k.first + j) % m] = min(new_result[(k.first + j) % m], result[j] + k.second); } } swap(result, new_result); } for(ll i=0; i<m; i++) answer[i] = min(answer[i], result[i]); ll opennodes = 0, donenodes = 0; for(auto k: answer) if(k != LONG_LONG_MAX) opennodes++; vector<ll> d(m, LONG_LONG_MAX); while(true){ ll v = argmin(answer); if(answer[v] == LONG_LONG_MAX) break; d[v] = answer[v]; donenodes++; for(ll i=0; i<m; i++){ if(d[(v + i) % m] == LONG_LONG_MAX && d[i] != LONG_LONG_MAX){ if(answer[(v + i) % m] == LONG_LONG_MAX) opennodes++; answer[(v + i) % m] = min(answer[(v + i) % m], d[v] + d[i]); } } answer[v] = LONG_LONG_MAX; } //--------------------- d[0] = 0; for(auto k: d) if(k != LONG_LONG_MAX) cout<<k<<'\n'; else cout<<"-1\n"; return 0; } |