Cod sursa(job #1028271)

Utilizator thewildnathNathan Wildenberg thewildnath Data 13 noiembrie 2013 20:27:22
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<stdio.h>
#include<vector>
#include<math.h>
using namespace std;

#define NMAX 1502
#define INF (1<<30)
#define MOD 104659
#define EPS 0.0000000001
int n;
int nr[NMAX],viz[NMAX];
double dist[NMAX];

vector <pair<int, double> > v[NMAX];

inline int cmp(double a,double b)
{
    if(a>b+EPS)
        return 1;
    if(a+EPS<b)
        return -1;
    return 0;
}


int main()
{
    freopen("dmin.in","r",stdin);
    freopen("dmin.out","w",stdout);
    int i,j,m,nod,x,y;
    double c,mini;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%lf",&x,&y,&c);

        v[x].push_back(make_pair(y,log(c)));
        v[y].push_back(make_pair(x,log(c)));
    }

    for(i=2;i<=n;++i)
        dist[i]=INF;

    nr[1]=1;
    //dist[1]=1;

    for(i=1;i<=n;++i)
    {
        mini=INF;
        for(j=1;j<=n;++j)
            if(!viz[j] && dist[j]<mini)
            {
                mini=dist[j];
                nod=j;
            }

        if(mini==INF)
            break;
        viz[nod]=1;

        //printf("%d %d\n",mini,nod);

        for(j=0;j<v[nod].size();++j)
        {
            if(cmp(dist[v[nod][j].first] , dist[nod]+v[nod][j].second)==0)
                nr[v[nod][j].first]+=nr[nod];
            else if(cmp(dist[v[nod][j].first] , dist[nod]+v[nod][j].second)==1)
            {
                dist[v[nod][j].first]=dist[nod]+v[nod][j].second;
                nr[v[nod][j].first]=nr[nod];
            }
        }

    }

    for(i=2;i<=n;++i)
        printf("%d ",nr[i]);
    printf("\n");

    return 0;
}