一道水题。。。。
因为是无权图
对于整个图应用一个bfs处理出最短路,
之后在重复更新时应用一个转移方程即可
sum[x]=∑sum[n];,n为能更新x最短路的点。
上代码~
#include<queue> #include<stdio.h> using namespace std; int n;int m; struct data { int v;int next; }edge[4000010]; int cnt;int alist[1000010]; void add(int u,int v) { edge[++cnt].v=v; edge[cnt].next=alist[u]; alist[u]=cnt; return; } int step[1000010];int now; int res[1000010]; queue <int> q; int main() { scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { int u;int v; scanf("%d%d",&u,&v); add(u,v);add(v,u); } step[1]=1;res[1]=1;//到自己的最短路记为1,这样可以省一个book q.push(1); while(!q.empty())//bfs膜板,没啥好说的 { now=q.front();q.pop(); //printf("now=%d\n",now); int next=alist[now]; while(next) { int v=edge[next].v; if(step[v]==0) { step[v]=step[now]+1;//处理最短路 //printf("->step[%d]=%d\n",v,step[v]); res[v]+=res[now];//处理方案 q.push(v); } else if(step[v]==step[now]+1)//另一种最短路方案 { //printf("->step[%d]=%d\n",v,step[v]); res[v]+=res[now];res[v]%=100003; //处理方案 } next=edge[next].next; } } for(int i=1;i<=n;i++)//输出结果 { printf("%d\n",res[i]); } return 0;//拜拜程序~ }
时间: 2024-10-01 04:39:31