[图论]最短路计数(spfa)

最短路计数

Description

给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N。问从顶点11开始,到其他每个点的最短路有几条。

Input

第一行包含22个正整数N,MN,M,为图的顶点数与边数。

接下来MM行,每行22个正整数x,yx,y,表示有一条顶点xx连向顶点yy的边,请注意可能有自环与重边。

output

共NN行,每行一个非负整数,第ii行输出从顶点11到顶点ii有多少条不同的最短路,由于答案有可能会很大,你只需要输出ans \bmod 100003ansmod100003后的结果即可。如果无法到达顶点ii则输出00。

Examples

Input

5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5

Output

1
1
1
2
4

正确解法:

找最短路当然要最短路了啊spfa。

然后就是更新的时候,如果这个点被更新了,那么就是以前的

ans[y]=ans[x];

如果已经是最短路了,那么就是 ans[y]=ans[y]+ans[x];

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<map>
 6 #include<set>
 7 #include<vector>
 8 #include<queue>
 9 #include<algorithm>
10 #include<cmath>
11 using namespace std;
12 typedef long long ll;
13 const int inf=0x7fffffff;
14 const int N=1000000+10;
15 const int M=2000000+10;
16 const int mod=100003;
17 int T,n,m,w,xx,yy,vv;
18 int Link[N],len=0,bok[N],dis[N],upp[N],que[M],ans[N];
19 struct student
20 {
21     int y,v,next;
22 }e[M];
23 void insert(int xx,int yy,int vv)
24 {
25     e[++len].next=Link[xx];
26     Link[xx]=len;
27     e[len].y=yy;
28     e[len].v=vv;
29 }
30 void init()
31 {
32     memset(e,0,sizeof(e));
33     memset(Link,0,sizeof(Link));
34     len=0;
35     scanf("%d %d",&n,&m);
36     while(m--)
37     {
38         scanf("%d %d",&xx,&yy);
39         insert(xx,yy,1);
40         insert(yy,xx,1);
41     }
42 }
43 void print()
44 {
45     for(int i=1;i<=n;i++)
46         printf("%d\n",ans[i]);
47 }
48 void spfa()
49 {
50     memset(upp,0,sizeof(upp));
51     memset(bok,0,sizeof(bok));
52     memset(que,0,sizeof(que));
53     for(int i=1;i<=n;i++)
54         dis[i]=inf;
55     int head=1,tail=2;
56     dis[1]=0;
57     que[1]=1;
58     bok[1]=1;
59     ans[1]=1;
60     while(head<tail)
61     {
62         int tt=que[head];
63         bok[tt]=0;
64         for(int i=Link[tt];i;i=e[i].next)
65         {
66             if(dis[e[i].y]>dis[tt]+e[i].v)
67             {
68                 dis[e[i].y]=dis[tt]+e[i].v;
69                 ans[e[i].y]=ans[tt];
70                 if(bok[e[i].y]==0)
71                 {
72                     que[tail++]=e[i].y;
73                     bok[e[i].y]=1;
74                 }
75             }
76             else if(dis[e[i].y]==dis[tt]+e[i].v)
77             {
78                 ans[e[i].y]+=ans[tt];
79                 ans[e[i].y]%=mod;
80             }
81         }
82         head++;
83     }
84 }
85 int main()
86 {
87     init();
88     spfa();
89     print();
90
91     return 0;
92 }

原文地址:https://www.cnblogs.com/Kaike/p/10500562.html

时间: 2024-07-30 01:52:33

[图论]最短路计数(spfa)的相关文章

POJ 3259 Wormholes (图论---最短路 Bellman-Ford || SPFA)

链接:http://poj.org/problem?id=3259 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BE

洛谷P1144 最短路计数(SPFA)

To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输

【SPFA】 最短路计数

最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. [输出格式]   输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0. [输入样

习题:最短路计数(SPFA最短路计数)

最短路计数(洛谷1144)题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条.输入输出格式输入格式:输入第一行包含2个正整数N,M,为图的顶点数与边数.接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边.输出格式:输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0.输入输出样例输

模板C++ 03图论算法 1最短路之单源最短路(SPFA)

3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于0, 就说这条路是一个负权回路. 回归正题,SPFA是bellman-ford的一种改进算法,由1994年西安交通大学段凡丁提出.它无法处理带有负环的图,判断方法:如果某个点进入队列的次数超过N次则存在负环. SPFA的两种写法,bfs和dfs,bfs判别负环不稳定,相当于限深度搜索

洛谷P1144 最短路计数 及其引申思考

图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的

洛谷 1144 最短路计数 bfs

洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移,最后输出cnt即为结果.. 题目中所说的重边和自环啥的没看出来有啥影响.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxn = 100000 + 500;

图论——最短路②

RT 最短路计数 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0. 样例 输入: 输出

班级娱乐赛 K短路计数

K短路计数 同学出的题目,有原题的,但找不到了. Description 题目背景(来源):小 L 从<挑战程序设计竞赛>中翻到了一道图论(暴力)好题. 给定一个 n 个定顶点,边长为 1 的有向图邻接矩阵.求这个图中长度为 k 的不同的路径 总数.(不懂看样例) 1.路径中同一条边可经过多次. 2.输出答案对(1e7)+7 取模. 3.图中会有自环. Input 输入文件名为 count.in. 输入第一行为两个用空格隔开正整数,分别为 n 和 k 的值. 接下来输入 n 行(一个普通的邻接