/* 3 2 6 1 2 1 2 2 2 1 1 5 */ #include <iostream> #include <vector> using namespace std; int main() { int n, k, m; cin>>n>>k>>m; vector<vector<pair<int, int>>> zelki(k); for(int i=0; i<n; i++) { int a, b, c; cin>>a>>b>>c; zelki[a-1].push_back({b, c}); //masa, cena } vector<vector<vector<long long>>> vec(k); //[kolor][ilosc][masa] for(int i=0; i<k; i++) { vec[i].resize(m+1); vec[i][0].resize(m, -1); vec[i][0][0] = 0; vec[i][1].resize(m, -1); for(auto x : zelki[i]) if(vec[i][1][x.first]==-1 || vec[i][1][x.first] > x.second) vec[i][1][x.first] = x.second; for(int j=2; j<m+1; j++) { vec[i][j].resize(m, -1); for(int l=0; l<m; l++) { if(vec[i][j-1][l] == -1) continue; for(auto x : zelki[i]) if(vec[i][j][(x.first+l)%m]==-1 || vec[i][j][(x.first+l)%m] > x.second + vec[i][j-1][l]) vec[i][j][(x.first+l)%m] = x.second + vec[i][j-1][l]; } } } /* for(int i=0; i<k; i++) { cout<<" - - -\nKolor "<<i<<"\n"; for(int j=0; j<m+1; j++) { for(int l=0; l<m; l++) cout<<vec[i][j][l]<<"\t"; cout<<"\n"; } } */ vector<vector<long long>> vec2; vec2 = vec[0]; for(int i=1; i<k; i++) { for(int j=0; j<=m; j++) { vector<long long> nw(m, -1); for(int l=0; l<m; l++) { if(vec2[j][l]==-1) continue; for(int p=0; p<m; p++) { if(vec[i][j][p]==-1) continue; if(nw[(l+p)%m]==-1 || nw[(l+p)%m] > vec[i][j][p] + vec2[j][l]) nw[(l+p)%m] = vec[i][j][p] + vec2[j][l]; } } vec2[j] = nw; } } /* for(auto& x : vec2) { for(auto y : x) cout<<y<<"\t"; cout<<"\n"; } */ for(int i=0; i<m; i++) { long long mi = vec2[0][i]; for(int j=1; j<m; j++) { if(mi==-1 || (vec2[j][i]!=-1 && vec2[j][i] < mi)) mi = vec2[j][i]; } cout<<mi<<"\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 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 | /* 3 2 6 1 2 1 2 2 2 1 1 5 */ #include <iostream> #include <vector> using namespace std; int main() { int n, k, m; cin>>n>>k>>m; vector<vector<pair<int, int>>> zelki(k); for(int i=0; i<n; i++) { int a, b, c; cin>>a>>b>>c; zelki[a-1].push_back({b, c}); //masa, cena } vector<vector<vector<long long>>> vec(k); //[kolor][ilosc][masa] for(int i=0; i<k; i++) { vec[i].resize(m+1); vec[i][0].resize(m, -1); vec[i][0][0] = 0; vec[i][1].resize(m, -1); for(auto x : zelki[i]) if(vec[i][1][x.first]==-1 || vec[i][1][x.first] > x.second) vec[i][1][x.first] = x.second; for(int j=2; j<m+1; j++) { vec[i][j].resize(m, -1); for(int l=0; l<m; l++) { if(vec[i][j-1][l] == -1) continue; for(auto x : zelki[i]) if(vec[i][j][(x.first+l)%m]==-1 || vec[i][j][(x.first+l)%m] > x.second + vec[i][j-1][l]) vec[i][j][(x.first+l)%m] = x.second + vec[i][j-1][l]; } } } /* for(int i=0; i<k; i++) { cout<<" - - -\nKolor "<<i<<"\n"; for(int j=0; j<m+1; j++) { for(int l=0; l<m; l++) cout<<vec[i][j][l]<<"\t"; cout<<"\n"; } } */ vector<vector<long long>> vec2; vec2 = vec[0]; for(int i=1; i<k; i++) { for(int j=0; j<=m; j++) { vector<long long> nw(m, -1); for(int l=0; l<m; l++) { if(vec2[j][l]==-1) continue; for(int p=0; p<m; p++) { if(vec[i][j][p]==-1) continue; if(nw[(l+p)%m]==-1 || nw[(l+p)%m] > vec[i][j][p] + vec2[j][l]) nw[(l+p)%m] = vec[i][j][p] + vec2[j][l]; } } vec2[j] = nw; } } /* for(auto& x : vec2) { for(auto y : x) cout<<y<<"\t"; cout<<"\n"; } */ for(int i=0; i<m; i++) { long long mi = vec2[0][i]; for(int j=1; j<m; j++) { if(mi==-1 || (vec2[j][i]!=-1 && vec2[j][i] < mi)) mi = vec2[j][i]; } cout<<mi<<"\n"; } return 0; } |