Cod sursa(job #1232664)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 23 septembrie 2014 17:16:37
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 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-10
#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;
                    q.push(k.y);
                }
                if(nr[k.y]>mod) nr[k.y]-=mod;
                if(nr[x]>mod) nr[x]-=mod;



                //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;
}