Cod sursa(job #374381)

Utilizator swift90Ionut Bogdanescu swift90 Data 16 decembrie 2009 22:17:44
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
#define pb push_back
#define INF 999999999
#define PII pair<int, int>
typedef pair<int, int> hh;
vector < pair<int, int> > nr[1024];
priority_queue < PII , vector<PII>, greater <PII> > H;
int dist[1024][1024];
int poz[1024],calc[1024],cost[1024],k;
void df(int n){
	if(calc[n])
		return;
	int pp=0,vec,i,sz=nr[n].size();
	for(i=0;i<sz;++i)
		df(nr[n][i].first);
	
	while(!H.empty())
		H.pop();
	for(i=0;i<sz;++i){
		vec=nr[n][i].first;
		poz[vec]=1;
		cost[vec]=nr[n][i].second;
		H.push(hh(cost[vec]+dist[vec][1],vec));
	}
	for(i=0;i<k && !H.empty(); ++i){
		PII rad=H.top();
		H.pop();
		if(rad.first>=INF)
			break;
		dist[n][++pp]=rad.first;
		++poz[rad.second];
		if(poz[rad.second]<=k){
			vec=rad.second;
			H.push( hh(dist[vec][poz[vec]]+cost[vec],vec) );
		}
	}
	calc[n]=1;
}
int main(){
	freopen("pitici.in","r",stdin);
	freopen("pitici.out","w",stdout);
	int n,m;
	int a,b,c,i;
	scanf("%d%d%d",&n,&m,&k);
	for(i=0;i<m;++i){
		scanf("%d%d%d",&a,&b,&c);
		nr[a].pb(hh(b,c));
	}
	for(a=1;a<=n;++a){
		for(b=1;b<=n;++b)
			dist[a][b]=INF;
	}
	dist[n][1]=0;
	df(1);
	
	for(i=1;i<=k;++i)
		printf("%d ",dist[1][i]);
	printf("\n");
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}