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

题目:

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

题解:

用一个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];
}

猜你喜欢

转载自blog.csdn.net/cqbz_lipengcheng/article/details/107725165
今日推荐