Cod sursa(job #1232653)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 23 septembrie 2014 16:58:06
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cmath>

#define MMAX 2501
#define NMAX 1501
#define x first
#define y second
#define eps 1e-5
#define inf 1e9
#define mp make_pair
#define pb push_back
#define mod 104659

using namespace std;
int n, m, nr[NMAX];
double dmin[NMAX];
vector <pair<double, int> > v[NMAX];
bool use[NMAX];

class compare
{
    public:
    bool operator()(const int &a, const int &b)
    {
        if(dmin[a]<dmin[b])
            return true;
        return false;
    }
};

priority_queue <int, vector<int>, compare> q;


void read()
{
    freopen("dmin.in", "r", stdin);
    freopen("dmin.out", "w", stdout);
    int a, b, c;
    double cc;
    scanf("%i %i", &n, &m);
    for(int i=1; i<=m; i++)
    {
        scanf("%i %i %i", &a, &b, &c);
        cc=log(c);
        v[a].pb(mp(cc,b));
        v[b].pb(mp(cc,a));
    }

}

void dijkstra()
{
    for(int i=2; i<=n; i++)
        dmin[i]=inf;

q.push(1);
use[1]=1;
nr[1]=1;
int x;
    while(!q.empty())
    {

    x=q.top();
    q.pop();
    use[x]=1;
    for(int i=0;i<v[x].size();++i)
    {
        pair<double, int> k=v[x][i];
        if(!use[k.y])
        {

if( fabs(dmin[k.y]-dmin[x]+k.x) < eps )
    nr[x]+=nr[k.y];
    if( fabs(dmin[k.y]-dmin[x]-k.x) < eps )
        nr[k.y]+=nr[x];
    else
     if(dmin[k.y]>dmin[x]+k.x)
    {
        nr[k.y]=nr[x];
        dmin[k.y]=dmin[x]+k.x;
    }
if(nr[k.y]>mod) nr[k.y]-=mod;
if(nr[x]>mod) nr[x]-=mod;

    q.push(k.y);

     while(use[q.top()] && !q.empty())
            q.pop();
            //use[k.y]=1;
    }

    }
    }

}

int main()
{
    read();
    dijkstra();

    for(int i=2;i<=n;i++)
        printf("%i ", nr[i]);
        printf("\n");
    return 0;
}