Cod sursa(job #352950)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 3 octombrie 2009 20:01:03
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define N 1<<16
#define NMAX 1<<20
#define inf 1000000000
using namespace std;
int n,m,cost[N],r,coada[NMAX];
vector <pair <int,int> > vecini[N];
char stiva[N];
void read()
{
	scanf("%d%d",&n,&m);
	int i,x,y,z;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		vecini[x].push_back(make_pair(y,z));
	}
}
void solve()
{
	coada[++r]=1;
	stiva[1]=1;
	int i,j,ok=1,ant=0,act;
	for (i=1; i<=n; i++)
		cost[i]=inf;
	cost[1]=0;
	while (ok)
	{
		act=r;
		ok=0;
		for (i=ant+1; i<=act; i++)
		{
			stiva[i]=0;
			for (j=0; j<vecini[coada[i]].size(); j++)
				if (cost[coada[i]]+vecini[coada[i]][j].second<cost[vecini[coada[i]][j].first])
				{
					cost[vecini[coada[i]][j].first]=cost[coada[i]]+vecini[coada[i]][j].second;
					if (!stiva[vecini[coada[i]][j].first])
					{
						coada[++r]=vecini[coada[i]][j].first;
						stiva[vecini[coada[i]][j].first]=1;
						ok=1;
					}
				}
		}
		ant=act;
	}
}
void time_for_the_real_show()
{
	int i;
	for (i=2; i<=n; i++)
		printf("%d ",cost[i]!=inf ? cost[i] : 0);
	printf("\n");
}
int main()
{
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	read();
	solve();
	time_for_the_real_show();
	return 0;
}