Pagini recente » Cod sursa (job #2011804) | Cod sursa (job #3005046) | Cod sursa (job #3240191) | Cod sursa (job #1145696) | Cod sursa (job #3199512)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define INF 1000000000
using namespace std;
ifstream fin ("pitici.in");
ofstream fout("pitici.out");
struct elem
{
int x,c,nr;
};
struct cmp
{
bool operator()(elem a,elem b)const { return a.c>b.c;}
};
int n,m,k,x,y,c,i,j,vecin,nr,cost,COST[1030][1030],D[1030][1030];
vector <pair<int,int>> L[1030];
vector <int> S_top;
bool viz[1030];
void dfs(int x)
{
viz[x]=1;
for(auto& j:L[x])
if(!viz[j.second])
dfs(j.second);
S_top.push_back(x);
}
int main()
{
fin>>n>>m>>k;
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
COST[x][y]=c;
L[x].push_back({c,y});
}
dfs(1);
for(i=1;i<=n;i++)
for(j=1;j<=k;j++)
D[i][j]=INF;
D[n][1]=0;
for(auto& i:S_top)
{
priority_queue<elem,vector<elem>,cmp> Q;
if(L[i].empty())
continue;
for(auto& j:L[i])
{
vecin=j.second;
cost=j.first;
Q.push({vecin,D[vecin][1]+cost,1});
}
for(j=1;j<=k&&!Q.empty();j++)
{
elem top=Q.top();
Q.pop();
vecin=top.x;
cost=top.c;
nr=top.nr;
D[i][j]=cost;
Q.push({vecin,D[vecin][nr+1]+COST[i][vecin],nr+1});
}
}
for(i=1;i<=k;i++)
fout<<D[1][i]<<" ";
return 0;
}