洛谷P1144 最短路计数
广搜图的题
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 1e6+5, maxm = 2e6+5;
const int mod = 100003;
vector<int> g[maxn]; //邻接表,储存点i所能到达的点
int dist[maxn]; //储存点1到点i的距离
int cnt[maxn]; //存点1到点i的最短距离的数量
int n, m;
void bfs(){
memset(dist, 0x3f3f3f3f,sizeof(dist));
//使用0x7f会出错,因为距离更新比较时+1变负数
queue<int> q;
dist[1] = 0; cnt[1] = 1;//初始化到本身距离和方案
q.push(1);
while(q.size()){
int u = q.front(); q.pop();
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(dist[v] > dist[u] + 1){
//当前是新的最短路,cnt重新计数
dist[v] = dist[u] + 1;
cnt[v]=cnt[u];
cnt[v] %= mod;
q.push(v);
}
else if(dist[v] == dist[u] + 1){
//当前是长度和之前一样的最短路,cnt累加
cnt[v] += cnt[u];
cnt[v] %= mod;
}
}
}
}
int main(){
cin >> n >> m;
for(int i=0; i<m; i++){
int a, b;
cin >> a >> b;//无向图 =双向图
g[a].push_back(b);
g[b].push_back(a);
}
bfs();
for(int i=1; i<=n; i++){
cout << cnt[i] << endl;
}
return 0;
}