洛谷P1144 最短路计数 BFS

博客围绕一个无向无权图问题展开,给出N个顶点M条边的图,顶点编号1 - N,要求计算从顶点1到其他各点的最短路数量,可含自环与重边,结果需取模100003。题解用cnt数组记录最短路径条数,使用bfs求解。

题意:

给出一个N个顶点M条边的无向无权图,顶点编号为1−N。问从顶点1开始,到其他每个点的最短路有几条,可能有自环与重边。输出答案 mod 100003 后的结果即可。如果无法到达顶点i则输出0。

题解:

用一个cnt数组记录1点到达某个点的最短路径的条数,如果在某个时候已经求出u的深度,如果访问的点是v且v的距深度等于u的路径+1,则可知这条u至v的边是1到v的最短路径,所以cnt[v]=cnt[v]+cnt[u]; 由加法原理可知,如果有重边,累加cnt[u]即可。求解使用bfs即可。

AC代码:

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int dep[1000005], vis[1000005], cnt[1000005];
vector<int>Edge[1000005];
void bfs(int n)
{
	queue<int>que;
	que.push(1);
	dep[1] = 1, cnt[1] = 1, vis[1] = 1;
	while (!que.empty())
	{
		int u = que.front();
		que.pop();
		for (auto v : Edge[u])
		{
			if (!vis[v])
			{
				dep[v] = dep[u] + 1;
				vis[v] = 1;
				que.push(v);
			}
			if (dep[v] == dep[u] + 1)
				cnt[v] = (cnt[v] + cnt[u]) % 100003;
		}
	}
	for (int i = 1; i <= n; ++i)
		cout << cnt[i] << endl;
}
int main()
{
	int n, m, a, b;
	cin >> n >> m;
	for (int i = 0; i < m; ++i)
	{
		cin >> a >> b;
		if (a != b)
		{
			Edge[a].push_back(b);
			Edge[b].push_back(a);
		}
	}
	bfs(n);
	return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值