Cod sursa(job #700042)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 29 februarie 2012 23:03:41
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<deque>
#include<bitset>
#include<cmath>
#define ll long long
#define MOD 104659
#define eps 0.0000000001
#define oo 999999999
using namespace std;
vector<pair<int,double> >V[1510];
deque<int> Q;
bitset<1510> in_q;
void read(),solve();
int n,m,a,b,C,NR[1510],X,i;
double cost[1510],c;
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("dmin.in","r",stdin);
	freopen("dmin.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(;m;--m)
	{
		scanf("%d%d%d",&a,&b,&C);
		c=log(double(C));
		V[a].push_back(make_pair(b,c));
		V[b].push_back(make_pair(a,c));
	}
}
void solve()
{
	Q.push_back(1);
	for(i=1;i<=n;i++)cost[i]=oo;
	cost[1]=0;
	in_q[1]=1;
	NR[1]=1;
	for(;!Q.empty();)
	{
		X=Q.front();
		for(vector<pair<int,double> >::iterator it=V[X].begin();it!=V[X].end();it++)
		{
			b=it->first;
			c=it->second;
			if(abs(cost[b]-c-cost[X])<eps)
			{
				NR[b]+=NR[X];
				if(NR[b]>MOD)NR[b]-=MOD;
				if(!in_q[b])
				{
					Q.push_back(b);
					in_q[b]=1;
				}
			}
			if(cost[b]-cost[X]-c>eps)
			{
				cost[b]=cost[X]+c;
				NR[b]=NR[X];
				if(!in_q[b])
				{
					Q.push_back(b);
					in_q[b]=1;
				}
			}
		}
		in_q[X]=0;
		Q.pop_front();
	}
	for(i=2;i<=n;i++)printf("%d ",NR[i]);
}