Cod sursa(job #843219)

Utilizator gabriel93Robu Gabriel gabriel93 Data 27 decembrie 2012 16:36:22
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<stdio.h>
#define Nmax 50002
#define inf 100000
using namespace std;
int n,m;
int d[Nmax],viz[Nmax];

struct nod
{
	int v,c;
	nod *adresa;
};

nod *g[Nmax];

void adaug(int x,int y,int c)
{
	nod *p;
	p=new nod;
	p->v=y;
	p->c=c;
	p->adresa=g[x];
	g[x]=p;
}

void citire()
{
	int i,x,y,c;
	scanf("%d %d",&n,&m);
	for(i=1;i<=m;++i)
	{
		scanf("%d %d %d",&x,&y,&c);
		adaug(x,y,c);
	}
}

void rezolv()
{
	nod *p;
	int i,j,k,dmin;
	for(i=1;i<=n;++i)
		d[i]=inf;
	d[1]=0;
	viz[1]=1;
	for(p=g[1];p!=NULL;p=p->adresa)
		d[p->v]=p->c;
	for(k=1;k<=n-1;++k)
	{
		dmin=inf;
		for(i=2;i<=n;++i)
			if(viz[i]==0 && d[i]<dmin)
			{
				dmin=d[i];
				j=i;
			}
		viz[j]=1;
		for(p=g[j];p!=NULL;p=p->adresa)
			if(viz[p->v]==0 && d[j]+p->c < d[p->v])
				d[p->v]=d[j]+p->c;
	}
}

void scrie()
{
	int i;
	for(i=2;i<=n;++i)
		printf("%d ",d[i]);
}

int main()
{
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	citire();
	rezolv();
	scrie();
	fclose(stdin);
	fclose(stdout);
	return 0;
}