Pagini recente » Cod sursa (job #257376) | Cod sursa (job #1378748) | Cod sursa (job #1734343) | Cod sursa (job #2214333) | Cod sursa (job #500964)
Cod sursa(job #500964)
#include <stdio.h>
#include <vector>
#include <set>
#include <queue>
#define Nmax 1020
#define pb push_back
#define mp make_pair
#define y first
#define c second
#define INF 2147000000
using namespace std;
vector< pair<int,int> >v[Nmax];
multiset< pair<int,int> > Set;
queue< int > Q;
int dist[Nmax],ind[Nmax],grad[Nmax];
int N,M,K;
int main(){
vector< pair<int,int> >:: iterator it;
int i,x,y,z,c,dist_to_x;
freopen("pitici.in","r",stdin);
freopen("pitici.out","w",stdout);
scanf("%d%d%d",&N,&M,&K);
for(i=1; i<=M; ++i){
scanf("%d%d%d",&x,&y,&z);
v[x].pb(mp(y,z));
grad[y]++;
}
for(i=1;i<=N;++i) if(!grad[i]) Q.push(i);
ind[0]=N;
while(! Q.empty() ){
ind[ind[0]--]=x=Q.front(); Q.pop();
for(it=v[x].begin(); it!=v[x].end(); ++it){
--grad[it->y];
if(!grad[it->y]) Q.push(it->y);
}
}
for(i=1;i<=N-1;++i) dist[i]=INF;
for(i=1;i<=N;++i){
x=ind[i];
for(it=v[x].begin(); it!=v[x].end(); ++it)
if( dist[x] > dist[it->y]+it->c )
dist[x] = dist[it->y]+it->c;
}
Set.insert(mp(dist[1],1));
for(i=0;i<K;){
x=Set.begin()->second;
c=Set.begin()->first;
Set.erase(Set.begin());
if( x == N ){
++i;
printf("%d ",c);
continue;
}
dist_to_x=c-dist[x];
for(it=v[x].begin(); it!=v[x].end(); ++it){
Set.insert(mp(dist_to_x+it->c+dist[it->y], it->y));
if(Set.size()>K) Set.erase(--Set.end());
}
}
fclose(stdin); fclose(stdout);
return 0;
}