Cod sursa(job #523635)

Utilizator siminescuPaval Cristi Onisim siminescu Data 18 ianuarie 2011 18:26:19
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<fstream>
#include<vector>
#include<queue>
#include<math.h>
using namespace std;

ifstream f("dmin.in");
ofstream g("dmin.out");

# define nmax 1502
# define INF 22505
# define MOD 104659
typedef struct noduri{int vec;long double dist;};
vector <noduri> v[nmax];
queue <int> Q;
int N,M,P[nmax],l[nmax];
long double D[nmax];
bool inQ[nmax];

void citire()
{
	f>>N>>M;
	int i,a,b; noduri aux; long double c;
	for(;M;--M)
	{
		f>>a>>aux.vec>>c;
		if(c!=1) aux.dist=log10(c);
		else aux.dist=1;
		v[a].push_back(aux);
		b=aux.vec; aux.vec=a;
		v[b].push_back(aux);
	}
	for(i=1;i<=N;i++)
	{
		l[i]=v[i].size();
		D[i]=INF;
	}
}
int main()
{
	citire();
	int x,y,i;
	inQ[1]=1; Q.push(1); P[1]=1; D[1]=0;
	while(!Q.empty())
	{
		x=Q.front();inQ[x]=0;Q.pop();
		for(i=0;i<l[x];i++)
		{
			y=v[x][i].vec;
			if(D[x]+v[x][i].dist==D[y])
			{
				P[y]=(P[y]+P[x])%MOD;
				if(!inQ[y])
				{
					inQ[y]=1; Q.push(y);
				}
			}
			if(D[x]+v[x][i].dist<D[y])
			{
				D[y]=D[x]+v[x][i].dist;
				P[y]=P[x];
				if(!inQ[y])
				{
					inQ[y]=1; Q.push(y);
				}
			}
		}
	}
	for(i=2;i<=N;i++) g<<D[i]<<' ';
}