Cod sursa(job #117350)
#include<stdio.h>
#include<math.h>
#define Nmax 1515
#define eps 0.00000001
int vec[Nmax][Nmax], nvec[Nmax];
double cost[Nmax][Nmax];
int v[Nmax], c[Nmax];
double d[Nmax];
double modul(double x){
if(x<0) return -x;
return x;
}
int main(){
FILE *fin = fopen("dmin.in","r"),
*fout= fopen("dmin.out","w");
int N,M;
fscanf(fin,"%d%d",&N,&M);
for(int i=1;i<=M;i++){
int x,y,c;
fscanf(fin,"%d%d%d",&x,&y,&c);
vec[x][++nvec[x]] = y;
cost[x][nvec[x]] = log(c);
vec[y][++nvec[y]] = x;
cost[y][nvec[y]] = cost[x][nvec[x]];
}
//dijkstra
d[1] = 0;
c[1] = 1;
for(int i=2;i<=N;i++)
d[i] = 50000.0;
d[0] = 100000.0;
for(int i=2;i<=N;i++){
//aleg minimu
int poz = 0;
for(int j=1;j<=N;j++)
if(!v[j] && d[j] < d[poz])
poz = j;
//relaxare muchii
v[poz] = 1;
for(int j=1;j<=nvec[poz];j++){
int V = vec[poz][j];
if(d[V] - d[poz] - cost[poz][j] > eps){
//se modifica tot
d[V] = d[poz] + cost[poz][j];
c[V] = c[poz];
}
else
if( modul(d[V] - d[poz] - cost[poz][j]) < eps )
c[V] += c[poz];
}
}
for(int i=2;i<=N;i++)
fprintf(fout,"%d ",c[i]);
fclose(fout);
fclose(fin);
return 0;
}