Cod sursa(job #389920)

Utilizator mottyMatei-Dan Epure motty Data 2 februarie 2010 15:13:11
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<cstdio>
#include<vector>
#include<cmath>
#include<climits>
#define baz 0.000000001
#define INF (double)INT_MAX
#define db 104659
using namespace std;
const int N=2501,M=1000001;

int n,m,s[N],q[M],p,var[N],u;
double c[N];
bool viz[N];
struct xy{
	int to;
	double c;
};
vector <xy> v[N];

void read()
{
	int x,y,z;
	xy a;
	scanf("%d%d",&n,&m);
	for( int i=1 ; i<=m ; ++i )
	{
		scanf("%d%d%d",&x,&y,&z);
		a.c=log10((double)z);
		a.to=y;
		v[x].push_back(a);
		++s[x];
		a.to=x;
		v[y].push_back(a);
		++s[y];
	}
}

void ini()
{
	for( int i=2 ; i<=n ; ++i )
		c[i]=INF;
}

void check( int x )
{
	for( int i=0 ; i<s[x] ; ++i )
		if( c[x]+v[x][i].c < c[v[x][i].to] )
		{
			c[v[x][i].to]=c[x]+v[x][i].c;
			q[++u]=v[x][i].to;
		}
}

void bf()
{
	p=1;
	u=1;
	q[1]=1;
	while(p<=u)
	{
		check(q[p]);
		++p;
	}
}

inline double mod( double x )
{
	if( x<0 )
		return -x;
	return x;
}

void apel( int x )
{
	viz[x]=1;
	for( int i=0 ; i<s[x] ; ++i )
		if( mod( c[ v[x][i].to ] + v[x][i].c - c[x] ) <= baz )
		{
			if( viz[v[x][i].to]==0 )
				apel( v[x][i].to );
			var[x]+=var[v[x][i].to];
			if(var[x]>db)
				var[x]-=db;
		}
}

void solve()
{
	ini();
	bf();
	var[1]=1;
	viz[1]=1;
	for( int i=2 ; i<=n ; ++i )
		if(viz[i]==0)
			apel(i);
}

void print()
{
	for( int i=2 ; i<=n ; ++i )
		printf("%d ",var[i]);
}

int main()
{
	freopen("dmin.in","r",stdin);
	freopen("dmin.out","w",stdout);
	read();
	solve();
	print();
	return 0;
}