Cod sursa(job #388337)

Utilizator swift90Ionut Bogdanescu swift90 Data 29 ianuarie 2010 21:01:08
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#include<math.h>
#include<vector>
#include<queue>
using namespace std;

#define fs first
#define sc second
#define pb push_back
#define eps 1e-9
#define R 104659
#define INF 1000000

typedef pair<double, int> di;
vector <di> nr[1510];
priority_queue <di, vector<di>, greater<di> > Q;
int sol[1510];
double dist[1510];
int n,m;
inline double modul(double aa){
	if(aa<0)
		return -aa;
	return aa;
}
void solve(){
	int i,ss,x,y;
	double dy;
	vector <bool> viz(1510,false);
	while(!Q.empty()){
		x=Q.top().sc;
		Q.pop();
		if(viz[x])
			continue;
		viz[x]=true;
		ss=int(nr[x].size());
		for(i=0;i<ss;++i){
			y=nr[x][i].sc;
			dy=nr[x][i].fs;
			if(modul(dist[x]+dy-dist[y])<eps){
				sol[y]+=sol[x];
				if(sol[y]>=R)
					sol[y]-=R;
			}
			else{
				if(dist[x]+dy<dist[y]){
					dist[y]=dist[x]+dy;
					sol[y]=sol[x];
					Q.push(di(dist[y],y));
				}
			}
		}
	}
}
int main(){
	freopen("dmin.in","r",stdin);
	freopen("dmin.out","w",stdout);
	int i,a,b,c;
	double cc;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;++i){
		scanf("%d%d%d",&a,&b,&c);
		cc=double(log2(c));
		nr[a].pb(di(cc,b));
		nr[b].pb(di(cc,a));
	}
	Q.push(di(0,1));
	for(i=2;i<=n;++i)
		dist[i]=INF;
	sol[1]=1;
	solve();
	
	for(i=2;i<=n;++i)
		printf("%d ",sol[i]);
	printf("\n");
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}