Pagini recente » Cod sursa (job #1054354) | Cod sursa (job #1152712) | Cod sursa (job #2462585) | Cod sursa (job #2801567) | Cod sursa (job #168454)
Cod sursa(job #168454)
#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;
}