/*
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; } |
English