Cod sursa(job #389819)

Utilizator mottyMatei-Dan Epure motty Data 2 februarie 2010 11:59:53
Problema Drumuri minime Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<cstdio>
#include<cmath>
#include<vector>
#define baz 0.000000001
using namespace std;
const int N=2501,M=1000001;
int n,m,nr[N],s[N],q[M],p,u;
bool viz[N];
double c[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.to=y;
		a.c=log10((double)z);
		v[x].push_back(a);
		a.to=x;
		v[y].push_back(a);
		++s[x];
		++s[y];
	}
}

void check(int x)
{
	for( int i=0 ; i<s[x] ; ++i )
		if( c[x]+v[x][i].c - c[ v[x][i].to ] < -baz || viz[v[x][i].to]==0 )
		{
			q[++u]=v[x][i].to;
			c[v[x][i].to]=c[x]+v[x][i].c;
			nr[v[x][i].to]=nr[x];
			viz[v[x][i].to]=1;
		}
		else if( c[x]+v[x][i].c - c[v[x][i].to] < baz )
		{
			nr[v[x][i].to]+=nr[x];
		}
}

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

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

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