Cod sursa(job #168454)

Utilizator razvi9Jurca Razvan razvi9 Data 31 martie 2008 14:04:56
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<cstdio>
#include<vector>
#include<cmath>
const double inf=-1.0; 
int n,m,i,x,y,c;
std::vector<std::pair<int,double> > a[1501];
double l;
double d[1501];
int nr[1501],h[1501],p[1501],viz[1501];
inline void swap(int i,int j)
{
	int aux=h[i];h[i]=h[j];h[j]=aux;
	p[h[i]]=i;p[h[j]]=j;
}
void up(int k)
{
	if(k<=1) return;
	int t=k>>1;
	if(d[h[t]]==inf || d[h[t]]>d[h[k]]){
		swap(k,t);
		up(t);}
}
void down(int k)
{
	int f1=k<<1,f2=(k<<1)+1;
	if(f1>m) return;
	if(f2<=m && d[h[f2]]!=inf && (d[h[f1]]==inf || d[h[f1]]>d[h[f2]])) f1=f2;
	if(d[h[f1]]==inf) return;
	if(d[h[k]]==inf || d[h[k]]>d[h[f1]]){
		swap(k,f1);
		down(f1);}
}
int get()
{
	if(m<1) return 0;
	swap(1,m);
	m--;
	down(1);
	int v=h[m+1];
	if(d[v]==inf) return 0;
	return v;
}
inline void dijkstra()
{
	for(i=1;i<=n;i++)
		d[i]=inf,h[i]=i,p[i]=i;
	d[1]=1.0;nr[1]=1;
	m=n;
	int vf;
	while(1){
		vf=get();
		viz[vf]=1;
		if(!vf) break;
		for(i=0;i<a[vf].size();i++)
			if(!viz[a[vf][i].first])
			if(d[a[vf][i].first]>d[vf]*a[vf][i].second || d[a[vf][i].first]==inf){
				d[a[vf][i].first]=d[vf]*a[vf][i].second;
				up(p[a[vf][i].first]);
				nr[a[vf][i].first]=nr[vf];}
			else
				if(d[a[vf][i].first]==d[vf]*a[vf][i].second)
					nr[a[vf][i].first]+=nr[vf];
	}
	for(i=1;i<=n;i++)
		printf("%d ",nr[i]);
}

int main()
{
	freopen("dmin.in","r",stdin);
	freopen("dmin.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%d %d %d",&x,&y,&c);
		if(c==2) l=1.0;
		else l=log((double)c);
		a[x].push_back(std::make_pair<int,double>(y,l));
		a[y].push_back(std::make_pair<int,double>(x,l));}
	dijkstra();
	fclose(stdout);
	return 0;
}