zoukankan      html  css  js  c++  java
  • 题解 P1144 【最短路计数】

    这道题用一次SPFA就可以过了。在求最短路的同时,对答案进行统计即可。


    实现:

    (dis_i)表示从1到(i)的最短路(实在还是不懂的话看程序吧)。

    1. (dis_i>dis_j+1)时,直接令(ans_i=ans_j)即可。
    2. (dis_i=dis_j+1)时,那么到(i)的路径就可以多加上(j)的路径,即(ans_i=ans_i+ans_j)

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n , m , p = 100003;
    int ans[1000010] , dis[1000010];
    bool vis[1000010];
    vector<int> a[1000010];
    queue<int> q;
    void spfa(){
    	q.push(1);
    	ans[1] = 1;
    	vis[1] = 1;
    	dis[1] = 0;
    	while(!q.empty()){
    		int x = q.front();
    		q.pop();
    		for(int i = 0; i < a[x].size(); i++){
    			int y = a[x][i];
    			if(dis[y] > dis[x] + 1){
    				dis[y] = dis[x] + 1;
    				ans[y] = ans[x];
    				if(!vis[y]){
    					vis[y] = 1;
    					q.push(y);
    				}
    			}else if(dis[y] == dis[x] + 1) ans[y] = (ans[y] + ans[x]) % p;
    		}
    		vis[x] = 0;	//出队列了就可以标记未走过了,因为我们要重复更新这个点直到最优 
    	}
    }
    int main(){
    	cin >> n >> m;
    	for(int i = 1; i <= m; i++){
    		int x , y;
    		cin >> x >> y;
    		a[x].push_back(y);
    		a[y].push_back(x);
    	}
    	for(int i = 1; i <= n; i++) dis[i] = 0x7fffffff;
    	spfa();
    	for(int i = 1; i <= n; i++) cout << ans[i] << endl;
    	return 0;
    }
    
    
  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/bzzs/p/13088263.html
Copyright © 2011-2022 走看看