P1144 最短路计数

P1144 最短路计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

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

输入格式

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

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

输出格式

共 N 行,每行一个非负整数,第 i 行输出从顶点 1 到顶点 i 有多少条不同的最短路,由于答案有可能会很大,你只需要输出 ansmod100003 后的结果即可。如果无法到达顶点 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 和 22 条 1→3→4→5(由于 4→5 的边有 2 条)。

对于 20%20% 的数据,1≤N≤100;
对于 60%60% 的数据,1≤N≤103;
对于 100%100% 的数据,1≤N≤106,1≤M≤2×106。

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
const int N = 1e6 + 5;
const int mod = 100003;

int n, m;
vector<int>G[N];
int d[N], num[N];

void BFS() {
	memset(d, 0x3f3f3f3f, sizeof(d));
	d[1] = 0;
	num[1] = 1;
	queue<int>q;
	q.push(1);
	int t;
	while (!q.empty()) {
		t = q.front();
		q.pop();
		for (int i = 0; i < G[t].size(); i++) {
			int j = G[t][i];
			if (d[j] > d[t] + 1) {
				d[j] = d[t] + 1;
				num[j] = num[t];
				q.push(j);
			}
			else if (d[j] == d[t] + 1) {
				num[j]+=num[t];
				num[j] %= mod;
			}
		}
	}
}

int main() {
	cin >> n >> m;
	for (int i = 1,a,b,t; i <= m; i++) {
		scanf("%d%d", &a, &b);
		G[a].push_back(b);
		G[b].push_back(a);
	}
	BFS();
	for (int i = 1; i <= n; i++) {
		cout << num[i] << endl;
	}
	return 0;
}

posted @ 2023-09-03 16:52  Landnig_on_Mars  阅读(17)  评论(0编辑  收藏  举报  来源