最短路计数题解(图论版题)

本文介绍了一道图论问题,探讨如何在无向无权图中计算从顶点1出发到其他所有顶点的最短路径数量。通过使用b数组记录路径,并结合最短路径更新策略,可以得出每条最短路径的计数。文章提供了解题思路和局部代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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

题解:

用一个b数组来存路径,如果遇到可以从某点经过k(中转点)点到终点,且最短路与此时相同,那么路径数为:

路径数 = 起点最短路径数 + 终点最短路径数 + 1

如果遇到更短的最短路,那么路径为:

路径数 = 起点最短路径数

初值:起点步数置为1

局部代码:

int Dijkstra(int s, int t) {
	qu.push(edge(s, 0));
	dj[s] = 0;
	b[s] = 1;
	while(!qu.empty()) {
		edge r = qu.top();
		qu.pop();
		if(vis[r.qi]) {
			continue;
		}
		vis[r.qi] = 1;
		for(int i = 0;i < ve[r.qi].size(); i++) {
			node p = ve[r.qi][i];
			if(dj[r.qi] + p.v < dj[p.u]) {
				b[p.u] = b[r.qi];
				b[p.u] %= 100003;
				dj[p.u] = dj[r.qi] + p.v;
				qu.push(edge(p.u, dj[p.u]));
			}
			else if(dj[p.u] == dj[r.qi] + p.v) {
				b[p.u] += b[r.qi];
				b[p.u] %= 100003;
			}
		}
	}
	return dj[t];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值