洛谷1144 最短路计数

本题地址:http://www.luogu.org/problem/show?pid=1144

题目描述

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

输入输出格式

输入格式:

输入第一行包含2个正整数N,M,为图的顶点数与边数。
接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。

输出格式:

输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可。如果无法到达顶点i则输出0。

输入输出样例

输入样例#1:

5 7

1 2

1 3

2 4

3 4

2 3

4 5

4 5

输出样例#1:

1

1

1

2

4

说明

1到5的最短路有4条,分别为2条1-2-4-5和2条1-3-4-5(由于4-5的边有2条)。
对于20%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 100000,M ≤ 200000。

【思路】

BFS。

图的边权为1,可以使用BFS。BFS拓展的时候如果遇到没有访问过的则cnt[v]=cnt[u],如果遇到访问过而且d[v]==d[u]+1则将方案数累计入cnt[v]。

【代码】

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 using namespace std;
 6
 7 const int maxn = 1000000+10;
 8 const int MOD=100003;
 9 struct Edge{
10     int v,next;
11 }e[2*maxn];
12 int en,front[maxn];
13
14 int n,m;
15 int cnt[maxn];
16
17 inline int read_int() {
18     char c=getchar();
19     while(!isdigit(c)) c=getchar();
20     int x=0;
21     while(isdigit(c)) {
22         x=x*10+c-‘0‘;
23         c=getchar();
24     }
25     return x;
26 }
27 inline void AddEdge(int u,int v) {
28     en++;
29     e[en].v=v; e[en].next=front[u]; front[u]=en;
30 }
31
32 int vis[maxn],d[maxn];
33 void BFS() {
34     queue<int> q;
35     q.push(1); d[1]=1; cnt[1]=1; vis[1]=1;
36     while(!q.empty()) {
37         int u=q.front(); q.pop();
38         for(int i=front[u];i>=0;i=e[i].next) {
39             int v=e[i].v;
40             if(!vis[v]) {
41                 vis[v]=1;
42                 d[v]=d[u]+1;
43                 cnt[v]=cnt[u];
44                 q.push(v);
45             }
46             else  if(d[v]==d[u]+1){
47                 cnt[v]=(cnt[u]+cnt[v])%MOD;
48             }
49         }
50     }
51 }
52
53 int main() {
54     memset(front,-1,sizeof(front));
55
56     n=read_int() , m=read_int();
57     int u,v,w;
58     for(int i=1;i<=m;i++){
59         u=read_int(),v=read_int();
60         AddEdge(u,v);
61         AddEdge(v,u);
62     }
63
64     BFS();
65
66     for(int i=1;i<=n;i++) printf("%d\n",cnt[i]);
67     return 0;
68 }
时间: 2024-10-14 02:54:27

洛谷1144 最短路计数的相关文章

洛谷 1144 最短路计数 bfs

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

spfa+dp(洛谷1144 最短路计数)

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

洛谷1144最短路计数

一道水题.... 因为是无权图 对于整个图应用一个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

洛谷P1144 最短路计数(SPFA)

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

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

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

洛谷——P1144 最短路计数

https://www.luogu.org/problem/show?pid=1144#sub 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需

洛谷 P1144 最短路计数

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

洛谷P1144——最短路计数

题目:https://www.luogu.org/problemnew/show/P1144 spfa跑最短路的同时记录cnt数组表示到达方案数. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,a,b,head[1000005],ct,dis[1000005],cnt[1000005],hp[10000005],h=1,t=1,p=1000

[洛谷P1144]最短路计数

题目大意:求1到其他所有点的最短路径的条数. 解题思路:SPFA(我觉得更像BFS),因为边权为1,所以最先搜到的那次一定是最短路径,在答案中增加父节点的答案数.以后每次搜到最短路径相同时,再在答案中添加当前父节点的答案数.(具体见代码) C++ Code: #include<cstdio> #include<queue> #include<iostream> #include<cstring> using namespace std; int ans[10