Cod sursa(job #975799)

Utilizator dragangabrielDragan Andrei Gabriel dragangabriel Data 21 iulie 2013 17:34:52
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<bitset>
#define nmax 1501
#define E 1e-9
#define mod 204659
#define inf 2000000000
using namespace std;
int n,i,j,k,m,x,y,rez[nmax];
double dist[nmax];
vector<pair<int,double> >v[nmax];
queue<int>c;
bitset<nmax>viz;

int main()
{
	freopen("dmin.in","r",stdin);
	freopen("dmin.out","w",stdout);
	scanf("%d %d",&n,&m);
    for (i=1;i<=m;i++)
	{
		double cost;
        scanf("%d %d %d",&x,&y,&k);
		cost=log(k);
		v[x].push_back(make_pair(y,cost));
		v[y].push_back(make_pair(x,cost));
	}
	for(i=2;i<=n;i++) dist[i]=inf;
	c.push(1);rez[1]=1;viz[1]=1;
	while (!c.empty())
	{
		x=c.front();c.pop();viz[x]=0;
		for (vector<pair<int,double> >::iterator it=v[x].begin();it!=v[x].end();++it)
		{
			y=(*it).first;
			if (dist[x]+(*it).second+E<dist[y])
			{
				dist[y]=dist[x]+(*it).second;
				rez[y]=rez[x];
				if (!viz[y]) c.push(y),viz[y]=true;
			}else
				if (fabs(dist[x]+(*it).second-dist[y])<E)
				{
					rez[y]+=rez[x];
					if (rez[y]>=mod) rez[y]-=mod;
				}
		}
	}
	for (i=2;i<=n;i++) printf("%d ",rez[i]);
	return 0;
}