Cod sursa(job #859269)

Utilizator enedumitruene dumitru enedumitru Data 19 ianuarie 2013 23:32:37
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <cmath>
#include <vector>
#include <queue>
#include <bitset>
#define Nmax 1505
#define nod first
#define cost second
#define eps 1e-9
using namespace std;
ifstream f("dmin.in"); ofstream g("dmin.out");
const int inf = 2000000000, MOD = 104659;
int N, M, nrdr[Nmax];
double Dist[Nmax];
vector < pair <int, double> > L[Nmax];
queue <int> Q;
bitset <Nmax> viz;
void parc()
{   Q.push(1); nrdr[1]=1; viz[1]=1;
    while(!Q.empty())
    {   int a=Q.front(); Q.pop(); viz[a]=0;
        vector< pair <int, double> >::iterator it=L[a].begin(), sf=L[a].end();
        for(; it!=sf; ++it)
        {   int b=(*it).nod;
            if(Dist[a] + (*it).cost + eps < Dist[b])
                        {   Dist[b] = Dist[a] + (*it).cost;
                            nrdr[b] = nrdr[a];
                            if(!viz[b]) Q.push(b), viz[b]=1;
                        }
                else
                if(fabs(Dist[a] + (*it).cost - Dist[b]) < eps)
                        {   nrdr[b] += nrdr[a];
                            if(nrdr[b] >= MOD) nrdr[b] -= MOD;
                        }
        }
    }
}

int main()
{   f>>N>>M;
    for(int i=2; i<=N; ++i) Dist[i]=inf;
    while(M--)
        {   int x,y;
            double d;
            f>>x>>y>>d;
            double c=log(d);
            L[x].push_back(make_pair(y,c));
            L[y].push_back(make_pair(x,c));
        }
    parc();
    for(int i=2; i<=N; ++i) g<<nrdr[i]<<' ';
    g<<'\n'; g.close();
    return 0;
}