#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define ll long long
constexpr int maxn=7000+7;
constexpr ll inf=1e18;
int n,k,m;
int kolor,masa,wartosc;
pair<int,pair<int,int>>input[maxn];
vector<pair<int,ll>>vec;
//.f-nastepny .s-cena
ll solv[maxn];
ll dp[2][maxn];
void prepere()
{
for(int i=0;i<maxn;++i)
solv[i]=inf;
}
void Dijkstra()
{
priority_queue<pair<ll,int>>pq;
//.f=-cena .s=miejsce
pq.push({0,0});
while(!pq.empty())
{
auto top=pq.top();
pq.pop();
top.f=-top.f;
//po wszystkich sasiadach
for(auto &u: vec)//(top.s+u.f)%m <- destynacja
if(solv[(top.s+u.f)%m]>top.f+u.s)
{
solv[(top.s+u.f)%m]=top.f+u.s;
pq.push({-(top.f+u.s),(top.s+u.f)%m});
}
}
}
int32_t main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>k>>m;
for(int i=1;i<=n;++i)
cin>>input[i].f>>input[i].s.f>>input[i].s.s;
sort(&input[1],&input[n+1]);
prepere();
dp[0][0]=0;
for(int i=1;i<=m-1;++i)
dp[0][i]=inf;
int iter=0;
for(int kol=1;kol<=k;++kol)
{
for(int i=0;i<=m-1;++i)
dp[kol&1][i]=inf;
while(iter+1<=n && input[iter+1].f==kol)
{
iter++;
pair<int,int>v={input[iter].s.f, input[iter].s.s};
for(int i=0;i<=m-1;i++)
dp[kol&1][(i+v.f)%m] = min(dp[(kol-1)&1][i]+v.s, dp[kol&1][(i+v.f)%m]);
}
}
// dp[k] <- mam zapisany najmniejszy koszt sciezki danej dlugosci
for(int j=1;j<=m-1;++j)
if(dp[k&1][j]<inf)
vec.push_back({j,dp[k&1][j]});
Dijkstra();
cout<<"0\n";
for(int i=1;i<=m-1;++i)
{
if(solv[i]==inf)
cout<<"-1\n";
else
cout<<solv[i]<<'\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 | #include <bits/stdc++.h> using namespace std; #define f first #define s second #define ll long long constexpr int maxn=7000+7; constexpr ll inf=1e18; int n,k,m; int kolor,masa,wartosc; pair<int,pair<int,int>>input[maxn]; vector<pair<int,ll>>vec; //.f-nastepny .s-cena ll solv[maxn]; ll dp[2][maxn]; void prepere() { for(int i=0;i<maxn;++i) solv[i]=inf; } void Dijkstra() { priority_queue<pair<ll,int>>pq; //.f=-cena .s=miejsce pq.push({0,0}); while(!pq.empty()) { auto top=pq.top(); pq.pop(); top.f=-top.f; //po wszystkich sasiadach for(auto &u: vec)//(top.s+u.f)%m <- destynacja if(solv[(top.s+u.f)%m]>top.f+u.s) { solv[(top.s+u.f)%m]=top.f+u.s; pq.push({-(top.f+u.s),(top.s+u.f)%m}); } } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>k>>m; for(int i=1;i<=n;++i) cin>>input[i].f>>input[i].s.f>>input[i].s.s; sort(&input[1],&input[n+1]); prepere(); dp[0][0]=0; for(int i=1;i<=m-1;++i) dp[0][i]=inf; int iter=0; for(int kol=1;kol<=k;++kol) { for(int i=0;i<=m-1;++i) dp[kol&1][i]=inf; while(iter+1<=n && input[iter+1].f==kol) { iter++; pair<int,int>v={input[iter].s.f, input[iter].s.s}; for(int i=0;i<=m-1;i++) dp[kol&1][(i+v.f)%m] = min(dp[(kol-1)&1][i]+v.s, dp[kol&1][(i+v.f)%m]); } } // dp[k] <- mam zapisany najmniejszy koszt sciezki danej dlugosci for(int j=1;j<=m-1;++j) if(dp[k&1][j]<inf) vec.push_back({j,dp[k&1][j]}); Dijkstra(); cout<<"0\n"; for(int i=1;i<=m-1;++i) { if(solv[i]==inf) cout<<"-1\n"; else cout<<solv[i]<<'\n'; } return 0; } |
English