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

 

posted @ 2023-07-27 20:25  浪矢-CL  阅读(3)  评论(0编辑  收藏  举报