Cod sursa(job #2062602)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 10 noiembrie 2017 17:11:40
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <queue>
#include <vector>
#include <cmath>
#define MOD 104659
#define inf 1e9
#define eps 1e-9
using namespace std;
ifstream f ("dmin.in");
ofstream g ("dmin.out");
const int nmax=15e2+3;
int n,m,x,y,sol[nmax],nod,viz[nmax];
long double c,d[nmax];
vector <long double> cost[nmax];
vector <int> v[nmax];
priority_queue < pair <long double,int> > q;
int main()
{
    f>>n>>m;
    for(int i=1;i<=m;++i)
    {
        f>>x>>y>>c;
        v[x].push_back(y);
        v[y].push_back(x);
        c=log(c);
        cost[x].push_back(c);
        cost[y].push_back(c);
    }
    sol[1]=1;
    for(int i=2;i<=n;++i) d[i]=inf;
    q.push({0,1});
    while(!q.empty())
    {
        nod=q.top().second;
        q.pop();
        for(int i=0;i<v[nod].size();++i)
        {
            if(abs(d[v[nod][i]]-d[nod]-cost[nod][i])<=eps) sol[v[nod][i]]=(sol[v[nod][i]]+sol[nod])%MOD;
            if(d[v[nod][i]]-d[nod]-cost[nod][i]>eps)
            {
                d[v[nod][i]]=d[nod]+cost[nod][i];
                sol[v[nod][i]]=sol[nod];
                if(viz[v[nod][i]]==0)
                {
                    q.push({-d[v[nod][i]],v[nod][i]});
                    viz[v[nod][i]]=1;
                }
            }
        }
    }
    for(int i=2;i<=n;++i) g<<sol[i]<<' ';
    return 0;
}