如:从1开始

bfs

 1     queue<int> q;
 2     q.push(1);
 3     c[1]=1;
 4     v[1]=1;
 5     while(q.size()) {
 6         int x=q.front();
 7         q.pop();
 8         for(int i=head[x]; i; i=nxt[i]) {
 9             int y=ver[i];
10             if(!v[y]) {
11                 v[y]=1;
12                 d[y]=d[x]+1;
13                 q.push(y);
14             }
15             if(d[y]==d[x]+1) c[y]=(c[y]+c[x])%mod;
16         }
17     }
18 }
View Code

求出从1开始,分别到每个点最短路的条数。

解法1:

用bfs求出每个点的深度。

如果x到y有路径,d[y]=d[x]+1,c[y]+=c[x]。(d[x]表示x的深度,c[x]表示1到x最短路径的条数。)

P1144 最短路计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int N=1000005,M=2000005,mod=100003;
 6 
 7 int n,m,tot;
 8 int head[N],ver[M],nxt[M];
 9 int c[N],v[N],d[N];
10 
11 void add(int x,int y) {
12     ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
13 }
14 
15 void bfs() {
16     queue<int> q;
17     q.push(1);
18     c[1]=1;
19     v[1]=1;
20     while(q.size()) {
21         int x=q.front();
22         q.pop();
23         for(int i=head[x]; i; i=nxt[i]) {
24             int y=ver[i];
25             if(!v[y]) {
26                 v[y]=1;
27                 d[y]=d[x]+1;
28                 q.push(y);
29             }
30             if(d[y]==d[x]+1) c[y]=(c[y]+c[x])%mod;
31         }
32     }
33 }
34 
35 int main() {
36     cin>>n>>m;
37     for(int i=1; i<=m; i++) {
38         int x,y;
39         cin>>x>>y;
40         add(x,y);
41         add(y,x);
42     }
43     bfs();
44     for(int i=1; i<=n; i++) cout<<c[i]<<endl;
45     return 0;
46 }
View Code

解法二:

floyd

posted on 2022-05-10 20:29  我疯故我在  阅读(58)  评论(0)    收藏  举报