Cod sursa(job #391193)

Utilizator razvan_3dragomir razvan razvan_3 Data 5 februarie 2010 11:11:32
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream.h>
ifstream intrare("dijkstra.in");
ofstream iesire("dijkstra.out");
const long int inf=1<<30;
const unsigned maxn=50000;
struct graf
{
	unsigned int nod;
	int cost;
	graf *next;
};
long int n,m;
graf *start[maxn];
short int vizitat[maxn];
//int coada[maxn];
long int dist[maxn];
unsigned int q[maxn];
void add(long int a,unsigned int b,int c)
{
	graf *g=new graf;
	g->nod=b;
	g->cost=c;
	g->next=start[a];
	start[a]=g;
}
void citeste()
{
	intrare>>n>>m;long int a,b,c;
	for(int i=0;i<m;i++)
	{
		intrare>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
}
void lat()
{
	for(int i=1;i<=n;i++)dist[i]=inf;
	dist[1]=0;
	for(int i=1;i<=n;i++)
		q[i]=i;
	unsigned int ramase=n;
	while(ramase>0)
	{
		long int dist_min=inf;
		unsigned int care=0;
		for(int i=1;i<=ramase;i++)
		{
			if(dist[q[i]]<dist_min)
			{
				care=i;
				dist_min=dist[q[i]];
			}
		}
		if(dist_min==inf)break;
		unsigned int nod=q[care];
		q[care]=q[ramase--];
		graf *g=start[nod];
		vizitat[nod]=1;
		while(g)
		{
			unsigned int vecin=g->nod;
			if(vizitat[vecin]==0)
			{
				long int alt=dist[nod]+g->cost;
				if(alt<dist[vecin])
				{
					dist[vecin]=alt;
				}
			}
			g=g->next;
		}
	}
}

int main()
{
	citeste();
	lat();
	for(int i=2;i<=n;i++)
		iesire<<dist[i]<<" ";
	return 0;
}