#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<deque>
using namespace std;
const int maxn=1e5+5;
int dis[maxn],ans[maxn],vis[maxn];
#define pii pair<int,int>
#define F first
#define S second
vector< vector<pii> >G(maxn);
int v,n;
void spfa()
{
for(int i=1;i<=v;i++)
dis[i]=0x3f3f3f3,vis[i]=0;
deque<int>q;
q.push_front(1);
ans[1]=1;
dis[1]=0;
int sum=0;
while(q.size())
{
int k=q.front();q.pop_front();
//cout<<k<<' '<<dis[k]<<' '<<sum<<endl;
if(sum<dis[k]*(q.size()+1)){
q.push_back(k);
continue;
}
vis[k]=0;
sum-=dis[k];
for(int i=0;i<G[k].size();i++)
{
pii &p=G[k][i];
if(dis[p.F]>dis[k]+p.S)
{
dis[p.F]=dis[k]+p.S;
ans[p.F]=ans[k]; if(vis[p.F]==0)
{
if(q.size()&&dis[p.F]>dis[q.front()])
{
q.push_back(p.F);
}
else q.push_front(p.F);
vis[p.F]=1;
sum+=dis[p.F];
}
}
else if(dis[p.F]==dis[k]+p.S)
ans[p.F]=(ans[p.F]+ans[k])%100003;
}
}
}
int main()
{
scanf("%d%d",&v,&n);
for(int i=1;i<=n;i++)
{
int x,y,z;
scanf("%d%d",&x,&y);
z=1;
G[x].push_back({y,z});
G[y].push_back({x,z});
}
spfa();
for(int i=1;i<=v;i++)
printf("%d\n",ans[i]);
}
一本通1499:最短路计数
最新推荐文章于 2024-10-09 09:53:23 发布
该篇文章详细介绍了如何使用C++编写Dijkstra算法的SPFA变种,解决图中两点之间的最短路径问题,通过邻接表数据结构存储图并实现了优先队列操作。
摘要由CSDN通过智能技术生成