P1144 最短路计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;
const int N = 2e6+10;
struct edge
{
int from,to;
long long w;
edge(int a,int b,long long c)
{
from = a;
to = b;
w = c;
}
};
vector<edge> E[N]; //存图
struct node
{
int id;
long long n_dis;
node(int x,long long num)
{
id = x;
n_dis = num;
}
bool operator < (const node &a) const
{
return n_dis > a.n_dis;
}
};
int n,m;
int pre[N];
void print_path(int s,int t)
{
if(s==t)
{
cout<<s;
return;
}
print_path(s,pre[t]);
cout<<t;
}
long long dis[N];
long long ans[N];
bool vis[N];
void dijkstra(int s)
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
vis[i]=false;
ans[i]=0;
}
dis[s]=0;
ans[s]=1;
priority_queue<node> Q;
Q.push(node(s,dis[s]));
while(!Q.empty())
{
node u = Q.top();
Q.pop();
if(vis[u.id]) continue;
vis[u.id] = true;
for(int i=0;i<E[u.id].size();i++)
{
edge y = E[u.id][i];
if(vis[y.to]) continue;
if(dis[y.to] > y.w+u.n_dis)
{
dis[y.to] = y.w + u.n_dis;
ans[y.to] = ans[y.from];
Q.push(node(y.to,dis[y.to]));
pre[y.to] = u.id;
}else if(dis[y.to] == y.w + u.n_dis)
{
ans[y.to] =(ans[y.to]+ans[y.from])%100003;
}
}
}
}
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int k;
cin>>n>>m;
for(int i=1;i<=n;i++) E[i].clear();
while(m--)
{
int u,v,w=1;
cin>>u>>v;
E[u].push_back(edge(u,v,w));
E[v].push_back(edge(v,u,w));
}
dijkstra(1);
for(int i=1;i<=n;i++)
{
cout<<ans[i]<<endl;
}
return 0;
}