Cod sursa(job #2339027)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 8 februarie 2019 11:50:44
Problema Drumuri minime Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
#define MOD 104659
#define EPS 0.000000001
#define INF 1000000000.0
/// TONI BO$$ was here
/// #MLC

using namespace std;

double dr[1501];
int nrdr[1501];

struct node
{
    int nod;
    double dmin;
    bool operator <(const node &other) const
    {
        return dmin-other.dmin>EPS;
    }
};

struct edge
{
    int nod,en;
};

vector <edge> G[1501];

priority_queue < node > Q;

int main()
{
    int n,m,i,x,y,e,z;
    freopen("dmin.in","r",stdin);
    freopen("dmin.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d",&x,&y,&e);
        G[x].push_back({y,e});
        G[y].push_back({x,e});
    }
    for(i=2; i<=n; i++)
        dr[i]=INF;
    nrdr[1]=1;
    Q.push({1,0.0});
    while(!Q.empty())
    {
        node z=Q.top();
        Q.pop();
        for(auto w : G[z.nod])
            if(abs(dr[w.nod]-z.dmin-log(w.en))<=EPS)
                nrdr[w.nod]+=nrdr[z.nod];
            else
                if(dr[w.nod]>z.dmin+log(w.en))
                {
                    dr[w.nod]=z.dmin+log(w.en);
                    nrdr[w.nod]=nrdr[z.nod];
                    Q.push({w.nod,dr[w.nod]});
                }
    }
    for(i=2; i<=n; i++)
        printf("%d ",nrdr[i]);

    return 0;
}