题目大意:求1到其他所有点的最短路径的条数。
解题思路:SPFA(我觉得更像BFS),因为边权为1,所以最先搜到的那次一定是最短路径,在答案中增加父节点的答案数。以后每次搜到最短路径相同时,再在答案中添加当前父节点的答案数。(具体见代码)
C++ Code:
#include<cstdio> #include<queue> #include<iostream> #include<cstring> using namespace std; int ans[1000005]={0,1},head[4000010],nxt[4000010],to[4000010],dis[1000005]; int n,m,cnt=0; queue<int>q; inline void addedge(int x,int y){ to[++cnt]=y; nxt[cnt]=head[x]; head[x]=cnt; to[++cnt]=x; nxt[cnt]=head[y]; head[y]=cnt; } void spfa(){ memset(dis,0x3f,sizeof dis); dis[1]=0; q.push(1); while(!q.empty()){ int u=q.front(); q.pop(); for(int i=head[u];i;i=nxt[i]){ int v=to[i]; if(dis[v]==0x3f3f3f3f){//第一次到达,一定是最短路径。 dis[v]=dis[u]+1; ans[v]+=ans[u]; ans[v]%=100003; q.push(v); }else if(dis[v]==dis[u]+1)ans[v]=(ans[v]+ans[u])%100003;//又一次搜到最短路径,增加答案 } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;++i){ int x,y; scanf("%d%d",&x,&y); addedge(x,y); } spfa(); for(int i=1;i<=n;++i)cout<<ans[i]<<endl; return 0; }