Cod sursa(job #117350)

Utilizator moga_florianFlorian MOGA moga_florian Data 21 decembrie 2007 11:09:35
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#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;
}