Cod sursa(job #2811406)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 2 decembrie 2021 11:03:40
Problema Drumuri minime Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)(((a)<(b))?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define ll long long
#define forq(i,ii,n)for(i=ii;i<n;i++)
using namespace std;
ifstream in("dmin.in");
ofstream out("dmin.out");
constexpr double e=1e-10;
ll n,m,i,j,k,p[50001];vector<pair<double,ll>>a[50001];map<pair<double,ll>,bool>b;pair<double,ll>v,c[50001],t;double d[50001];
int main()
{
fill(d,d+50001,0);fill(c,c+50001,make_pair(LLONG_MAX,0));
in>>n>>m;
while(m--)
    in>>i>>j>>k,a[i].push_back(make_pair(log(k),j));
b[make_pair(0,1)]=1,c[1]=make_pair(0,1ll),p[1]=1;
while(b.empty()==0)
{
    v=b.begin()->first;
    b.erase(b.begin());
    //cout<<(v&USHRT_MAX)<<' '<<(v>>16)<<'\n';
    d[v.second]=v.first;
    for(auto i=a[v.second].begin();i!=a[v.second].end();++i)
        {
            t=make_pair(v.first+i->first,i->second);
            if(c[i->second].first-t.first>e)
                b.erase(c[i->second]),c[i->second]=t,b[c[i->second]]=1,p[i->second]=p[v.second];
                else if(abs(c[i->second].first-t.first)<=e)
                    p[i->second]+=p[v.second];
        }
}
for(i=2;i<=n;i++)out<<p[i]<<' ';
//cout<<fixed<<setprecision(92)<<e;
}