Cod sursa(job #2296721)

Utilizator YouDontNeedMyNameJurcut Paul YouDontNeedMyName Data 4 decembrie 2018 23:03:04
Problema Drumuri minime Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
#define mod 104659
using namespace std;
ifstream in("dmin.in");
ofstream out("dmin.out");
struct muchie{
    int vecin;
    long double cost;
};
long double e=0.0000000001;
long double dr[1505];
vector <muchie> lista[1505];
struct compare{
    bool operator()(int d1,int d2)
    {
        return dr[d1]>dr[d2];
    }
};
int nrdr[1505],ap[1505];
priority_queue<int,vector<int>,compare> pq;
int main()
{
    int n,m;
    in >> n >> m;
    for(int i=1; i<=n; i++)
    {
        dr[i]=-1;
    }
    for(int i=0; i<m; i++)
    {
        int x,y,c;
        in >> x >> y >> c;
        long double o=c;
        o=log(o);
        lista[x].push_back({y,o});
        lista[y].push_back({x,o});
    }
    pq.push(1);
    nrdr[1]=1;
    dr[1]=0;
    while(!pq.empty())
    {
        int nod=pq.top();
        pq.pop();
        for(int i=0; i<lista[nod].size(); i++)
        {
            int vecin=lista[nod][i].vecin;
            long double cost=lista[nod][i].cost;
            if(dr[vecin]==-1)
            {
                dr[vecin]=dr[nod]+cost;
                nrdr[vecin]=nrdr[nod];
                pq.push(vecin);
            }
            else if(dr[vecin]>dr[nod]+cost)
            {
                dr[vecin]=dr[nod]+cost;
                nrdr[vecin]=nrdr[nod];
            }
            else if(abs(dr[vecin]-dr[nod]-cost)<=e)
            {
                nrdr[vecin]=(nrdr[vecin]+nrdr[nod])%mod;
            }
        }
    }
    for(int i=2; i<=n; i++)
    {
        out << nrdr[i] << ' ';
    }
    return 0;
}