Cod sursa(job #381788)

Utilizator mihaimoldovanMihai Moldovan mihaimoldovan Data 11 ianuarie 2010 17:16:53
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
using namespace std;
#include<iostream>
#include<fstream>
#define NN 50005
#define infi 1<<30

int v[NN],d[NN],t[NN],n;

struct nod{int capat,cost;
		nod* next;};

nod *g[NN];

void adaugacapat(int i,int j,int c)
{nod *t=new nod;
t->capat=j;
t->cost=c;
t->next=g[i];
g[i]=t;
}

void dijsktra(int sursa)
{
	for(int i=0;i<=n;i++)//de la 0
		{
			v[i]=0;
			d[i]=infi;
			t[i]=-1;
		}
	//initializam sursa cu ce trebuie
	v[sursa]=1;
	d[sursa]=0;
	t[sursa]=0;
	for(nod *p=g[sursa] ; p ; p=p->next)
		{
			t[p->capat]=sursa;
			d[p->capat]=p->cost;
		}
	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;
	int i,j,c;	
	for(;m;m--)
	{
		scanf("%d%d%d",&i,&j,&c);
		adaugacapat(i,j,c);
	}
	dijsktra(1);
	freopen("dijkstra.out","w",stdout);
	for(int i=2;i<=n;i++)
		if(d[i]!=infi)printf("%d ",d[i]);
		else printf("%d ",0);
}