Cod sursa(job #70852)

Utilizator DastasIonescu Vlad Dastas Data 7 iulie 2007 23:04:01
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <cmath>

#define inf 1000000000.0
#define maxn 1501
#define eps 0.00000001

FILE *in = fopen("dmin.in","r"), *out = fopen("dmin.out","w");

struct graf
{
    int nod;
    double c;

    graf *next;
};

int n, m;
graf *a[maxn] = {NULL};

//dijkstra
double d[maxn];
int nr[maxn];
int q[maxn]; // 1 daca nodul i a fost deja ales

void add(int p, int nod, double cost)
{
    graf *q = new graf;

    q->next = a[p];
    q->nod = nod;
    q->c = cost;
    a[p] = q;
}

void read()
{
    fscanf(in, "%d %d", &n, &m);

    int t1, t2, cst;
    for ( int i = 0; i < m; ++i )
    {
        fscanf(in, "%d %d %d", &t1, &t2, &cst);

        double c = log(cst);

        add(t1, t2, c);
        add(t2, t1, c);
    }
}

int main()
{
    read();

    for ( int i = 2; i <= n; ++i )
        d[i] = inf;
    d[1] = 0.0;
    nr[1] = 1;

    for ( int i = 1; i < n; ++i )
    {
        double min = inf;
        int poz;
        for ( int j = 1; j <= n; ++j )
            if ( min - d[j] >= eps && !q[j] )
                min = d[j], poz = j;
        //printf("%lf\n", min);
        q[poz] = 1;

        graf *q = a[poz];

        while ( q )
        {
            if ( d[q->nod] - (d[poz] + q->c) >= eps)
                d[q->nod] = d[poz] + q->c, nr[q->nod] = nr[poz];
            else if ( fabs((d[poz] + q->c) - d[q->nod]) <= eps )
                nr[q->nod] += nr[poz];

            q = q->next;
        }
    }

    for ( int i = 2; i <= n; ++i )
        fprintf(out, "%d ", nr[i]);

	return 0;
}