Cod sursa(job #398567)

Utilizator swift90Ionut Bogdanescu swift90 Data 18 februarie 2010 22:58:49
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
#define fs first
#define sc second
#define INF 1000000000000LL
typedef pair<int,int> PII;
vector <PII> nr[36010];
priority_queue <PII,vector<PII>, greater<PII> > H;
int n,m,k;
long long dist[36010];
int cet[36010];
void DJ(){
	vector <bool> viz(36010,false);
	int x;
	while(!H.empty()){
		x=H.top().sc;
		H.pop();
		if(viz[x])
			continue;
		viz[x]=true;
		for(vector<PII>::iterator it=nr[x].begin();it!=nr[x].end();++it){
			if(dist[it->fs]==dist[x]+it->sc && cet[x]<cet[it->fs])
				cet[it->fs]=cet[x];
			if(dist[it->fs]>dist[x]+it->sc){
				dist[it->fs]=dist[x]+it->sc;
				cet[it->fs]=cet[x];
				H.push(PII(dist[it->fs],it->fs));
			}
		}
	}
}
int main(){
	freopen("catun.in","r",stdin);
	freopen("catun.out","w",stdout);
	int i,a,b,c;
	scanf("%d%d%d",&n,&m,&k);
	for(i=1;i<=n;++i)
		dist[i]=INF;
	for(i=0;i<k;++i){
		scanf("%d",&a);
		H.push(PII(0,a));
		cet[a]=a;
		dist[a]=0;
	}
	for(i=0;i<m;++i){
		scanf("%d%d%d",&a,&b,&c);
		nr[a].push_back(PII(b,c));
		nr[b].push_back(PII(a,c));
	}
	DJ();
	for(i=1;i<=n;++i)
		if(cet[i]==i)
			printf("0 ");
		else
			printf("%d ",cet[i]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}