Cod sursa(job #381779)

Utilizator totiotot io totio Data 11 ianuarie 2010 17:09:20
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
using namespace std;
#include <cstdio>
#include <vector>
#define NN 50005
#define INFINIT 1<<30
struct nod{
	int capat,cost;
	nod * next;
};

nod * G[NN];
int n,v[NN],d[NN],t[NN];


void addArc(int i,int j,int c){
	nod *p=new nod;
	p->capat=j , p->cost=c;
	p->next=G[i];
	G[i] = p;
}


void init(int sursa){
	for(int i=0;i<=n;++i)
		v[i]=0,t[i]=-1,d[i]=INFINIT;
	v[sursa]=1,t[sursa]=0,d[sursa]=0;
	for(nod *p=G[sursa]; p ; p=p->next)
		t[p->capat]=sursa, d[p->capat]=p->cost;
}

void dijkstra(int sursa){
	init(sursa);
	int gata=0;
	while(!gata){
		int pmin=0;
		for(int i=1;i<=n;++i)
			if(v[i]==0 && d[i]<d[pmin])
				pmin=i;
		if(pmin==0)
			gata=1;
		else{
			v[pmin]=1;
			for(nod* p=G[pmin] ; p ; p=p->next)
				if(v[p->capat]==0)
					if(d[p->capat]>d[pmin]+p->cost)
						d[p->capat] = d[pmin]+p->cost, t[p->capat]=pmin;
				
		}
	}
	
}

int main(){
	freopen("dijkstra.in","r",stdin);
	int m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		G[i]=NULL;
	
	for( ; m ;--m){
		
		int i,j,c;
		scanf("%d%d%d",&i,&j,&c);
		addArc(i,j,c);
	}
	dijkstra(1);
	
	//for(int i=1;i<=n;++i)
	//	printf("%d ",t[i]);
	freopen("dijkstra.out","w",stdout);
	for(int i=2;i<=n;++i)
		printf("%d ",d[i]!=INFINIT?d[i]:0);
	printf("\n");
	return 0;
}