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;
}