Cod sursa(job #3237178)

Utilizator maryyMaria Ciutea maryy Data 6 iulie 2024 02:25:41
Problema Drumuri minime Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("dmin.in");
ofstream out("dmin.out");
const int nmax=1500, mod=104659, inf=1e9;
int n, m;
vector <pair<int, double>> graph[nmax+1];
vector <double> d(nmax+1, inf);//produsul minim pana la nodul i
vector <int> mr(nmax+1);//de cate ori ajunge cu minimul la nodul i
bitset <nmax+1> vis;
void dijkstra()
{
    priority_queue <pair<double, int>> q;
    q.push({0, 1});
    d[1]=1;
    mr[1]=1;
    while(!q.empty())
    {
        int top = q.top().second;
        q.pop();
        if(vis[top]==0)
        {
            for(int i=0; i<graph[top].size(); i++)
            {
                int copil=graph[top][i].first;
                double dist=graph[top][i].second;
                if(d[copil]>dist+d[top])//nou minim
                {
                    d[copil]=dist+d[top];
                    mr[copil]=mr[top];
                    q.push({-d[copil], copil});
                }
                else if(d[copil]==dist+d[top])
                {
                    //out<<"ajunge in:"<<copil<<" din "<<top<<" cu costul "<<dist<<'\n';
                    mr[copil]+=mr[top];
                }
            }
            vis[top]=1;
        }
    }
}
int main()
{
    int x, y, z;
    in>>n>>m;
    for(int i=1; i<=m; i++)
    {
        in>>x>>y>>z;
        double rez = log((double)z);
        //out<<rez<<'\n';
        graph[x].push_back({y, rez});
        graph[y].push_back({x, rez});
    }
    dijkstra();
    for(int i=2; i<=n; i++)
    {
        out<<mr[i]<<" ";
    }
}