Pagini recente » Cod sursa (job #3360154) | Cod sursa (job #3360152) | Cod sursa (job #3362847)
#include <bits/stdc++.h>
using namespace std;
const double INF=1e18;
const int MOD=104659;
const double EPS=1e-9;
int n,m;
vector<vector<pair<int,pair<int,double>>>> g;
vector<int> dijkstra(int src)
{
vector<double> dist(n+1,INF);
vector<int> nrs(n+1,0);
priority_queue<pair<double,int>,vector<pair<double,int>>,greater<pair<double,int>>> pq;
dist[src]=0.0;
nrs[src]=1;
pq.push({0.0,src});
while(!pq.empty())
{
double d=pq.top().first;
int u=pq.top().second;
pq.pop();
if(d>dist[u]+EPS)
{
continue;
}
for(auto &e:g[u])
{
int v=e.first;
int w=e.second.first;
double log_w=e.second.second;
if(dist[u]+log_w<dist[v]-EPS)
{
dist[v]=dist[u]+log_w;
nrs[v]=nrs[u];
pq.push({dist[v],v});
}
else if(abs((dist[u]+log_w)-dist[v])<=EPS)
{
nrs[v]=(nrs[v]+nrs[u])%MOD;
}
}
}
return nrs;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
freopen("dmin.in","r",stdin);
freopen("dmin.out","w",stdout);
if(!(cin>>n>>m)) return 0;
g.resize(n+1);
for(int i=0;i<m;++i)
{
int u,v,w;
cin>>u>>v>>w;
double log_w=log((double)w);
g[u].push_back({v,{w,log_w}});
g[v].push_back({u,{w,log_w}});
}
vector<int> nrs=dijkstra(1);
for(int i=2;i<=n;++i)
{
cout<<nrs[i]<<(i==n?"":" ");
}
cout<<'\n';
return 0;
}