题目描述
给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。
输入格式:
输入第一行包含2个正整数N,M,为图的顶点数与边数。
接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。
输出格式:
输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可。如果无法到达顶点i则输出0。
范围
对于20%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1000000,M ≤ 2000000。
题解
略水,松弛的时候判断一下到目标点是否长度相同就行了,类递推
Code
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#define debug puts("-----")
#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)
#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)
#define fill(x, t) memset(x, t, sizeof(x))
#define min(x, y) x<y?x:y
#define max(x, y) x>y?x:y
#define PI (acos(-1.0))
#define EPS (1e-8)
#define INF (1<<30)
#define ll long long
#define db double
#define ld long double
#define N 1000021
#define E N * 4 + 1
#define MOD 100003
#define L 255
using namespace std;
struct edge{int x, y, w, next;}e[E];
int inQueue[N], dis[N], ans[N], ls[N];
int edgeCnt;
inline int read(){
int x = 0, v = 1;
char ch = getchar();
while (ch < '0' || ch > '9'){
if (ch == '-'){
v = -1;
}
ch = getchar();
}
while (ch <= '9' && ch >= '0'){
x = (x << 1) + (x << 3) + ch - '0';
ch = getchar();
}
return x * v;
}
inline int addEdge(int &cnt, const int &x, const int &y, const int &w = 1){
e[++ cnt] = (edge){x, y, w, ls[x]}; ls[x] = cnt;
return 0;
}
inline int spfa(const int &st, const int &n){
fill(inQueue, 0);
inQueue[st] = 1;
fill(dis, 63);
dis[st] = 0;
fill(ans, 0);
ans[st] = 1;
queue<int>q;
q.push(st);
while (!q.empty()){
int now = q.front(); q.pop();
ans[now] %= MOD;
for (int i = ls[now]; i; i = e[i].next){
if (dis[now] + e[i].w == dis[e[i].y]){
ans[e[i].y] += ans[now];
}else if (dis[now] + e[i].w < dis[e[i].y]){
ans[e[i].y] = ans[now];
dis[e[i].y] = dis[now] + e[i].w;
if (!inQueue[e[i].y]){
inQueue[e[i].y] = 1;
q.push(e[i].y);
}
}
}
inQueue[now] = 0;
}
}
int main(void){
int n = read(), m = read();
edgeCnt = 1;
rep(i, 1, m){
int x = read(), y = read();
addEdge(edgeCnt, x, y);
addEdge(edgeCnt, y, x);
}
spfa(1, n);
rep(i, 1, n){
printf("%d\n", ans[i]);
}
return 0;
}