Cod sursa(job #2840531)

Utilizator cdenisCovei Denis cdenis Data 27 ianuarie 2022 23:05:05
Problema Drumuri minime Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <cmath>

using namespace std;

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

const int MAX=1505;
const int MOD=104659;
const double eroare=0.0000001;
const double INF=1e9;
int n,m,a,b,tot[MAX];
double c;
vector < double > dist (MAX, INF);
struct T
{
    int nod;
    double dist;
};
struct cmp
{
    bool operator()(T a, T b)
    {
        return a.dist>b.dist;
    }
};
vector < T > v[MAX];
priority_queue < T, vector < T >, cmp > pq;

void dijkstra(int src)
{
    dist[src]=0;
    tot[src]=1;
    pq.push({src,0});
    while(!pq.empty())
    {
        int nod=pq.top().nod;
        pq.pop();
        for(auto ngh : v[nod])
        {
            int vecin=ngh.nod;
            double cost=ngh.dist;
            if(dist[vecin]-(dist[nod]+cost)>eroare)
            {
                dist[vecin]=dist[nod]+cost;
                tot[vecin]=tot[nod];
                pq.push({vecin,dist[vecin]});
            }
            else if(abs(dist[vecin]-(dist[nod]+cost))<eroare)
                tot[vecin]=(tot[vecin]+tot[nod])%MOD;
        }
    }
}

int main()
{
    fin >> n >> m;
    for(;m;--m)
    {
        fin >> a >> b >> c;
        c=log2(c);
        v[a].push_back({b,c});
        v[b].push_back({a,c});
    }
    dijkstra(1);
    for(int i=2;i<=n;i++)
        fout << tot[i] << " ";
    return 0;
}