洛谷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 @   浪矢-CL  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2017-07-27 乒乓球
2017-07-27 电梯
2017-07-27 考试(()9*
2017-07-27 华容道 noip2013 70分搜索
2017-07-27 生日蛋糕
点击右上角即可分享
微信分享提示