Cod sursa(job #500964)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 13 noiembrie 2010 21:20:49
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#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;
}