Cod sursa(job #2042393)

Utilizator Andrei2000Andrei Mihailescu Andrei2000 Data 18 octombrie 2017 16:06:47
Problema Drumuri minime Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define nmax 1502
#define dif 0.00000001
#define rem 104659
using namespace std;

ifstream fin ("dmin.in");
ofstream fout ("dmin.out");

priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > Q;
vector< pair<int,int> > G[nmax];
int n,m;
long double d[nmax];
long long r[nmax];

double lg(int x){
    double ww=log((double)x);
    return ww;
}

void dijkstra(int node){
    for(int i=1;i<=n;++i)d[i]=1000000;
    for(int i=1;i<=n;++i)r[i]=1;
    d[node]=0;
    Q.push({0,node});
    while(!Q.empty()){
        int dist=Q.top().first;
        int node_st=Q.top().second;
        Q.pop();
        if(d[node_st]<dist)continue;
        for(auto edge: G[node_st]){
            if(d[edge.first]>d[node_st]+lg(edge.second)){
                double ww=lg(edge.second);
                d[edge.first]=d[node_st]+ww;
                r[edge.first]=r[node_st];
                Q.push({d[edge.first],edge.first});
            }
            else if(abs(d[edge.first]-(d[node_st]+lg(edge.second)))<dif)
                r[edge.first]+=r[node_st];
        }
    }
}

int main()
{
    int a,b,c;
    fin>>n>>m;
    for(int i=1;i<=m;++i){
        fin>>a>>b>>c;
        G[a].push_back({b,c});
        G[b].push_back({a,c});
    }
    dijkstra(1);
    for(int i=2;i<=n;++i)
        fout<<r[i]<<' ';
    fout<<endl;
    return 0;
}