zoukankan      html  css  js  c++  java
  • HDU1688-POJ3463-Sightseeing(求次短路的条数)

    题意

    求出最短路和次短路的条数,当次短路比最短路长度小1时,输出条数之和,反之输出最短路条数。 

    题解

     dis1[],cnt1[],dis2[],cnt2[] 分别表示最短路的长度和条数,次短路的长度和条数。
     当当前距离小于当前点最短路长度的时候,更新二者长度和条数。
     当当前距离等于当前点最短路长度的时候,更新最短路条数。
     当当前距离小于当前点次短路长度的时候,更新次短路的长度和条数。
     当当前距离等于当前点次短路长度的时候,更新次短路的条数。

     push进队列的时候要标注push进去的是最短路还是次短路。

    C++代码

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    #define endl "
    "
    
    typedef long long ll;
    const int maxn = 1e5 + 7;
    const int INF = 1 << 30;
    
    struct edge{
        int to ,nxt,w;
    }e[maxn];
    
    int n , m ;
    
    int vis[maxn][2];
    int d[maxn][2],dp[maxn][2];
    int head[maxn],cnt;
    
    void init(){
        cnt = 0;
        memset(head,-1,sizeof head);
    }
    
    void add_edge(int u,int v,int w){
        e[cnt].to = v;
        e[cnt].nxt = head[u];
        e[cnt].w = w;
        head[u] = cnt++;
    }
    
    void dijstra(int s, int ee){
        for(int i = 1;i <= n ; i++)
        d[i][0] = d[i][1] = INF;
        memset(vis,0,sizeof vis);
        memset(dp,0,sizeof dp);
        d[s][0] = 0;
        dp[s][0] = 1;
        while(1){
            int maxn = INF;
            int v ,flag;
            for(int j = 1;j <= n ;j ++){
                if(!vis[j][0] && maxn > d[j][0]){
                    maxn = d[j][0];
                    v = j;
                    flag = 0;
                }
                else if(!vis[j][1] && maxn > d[j][1]){
                    maxn = d[j][1];
                    v = j;
                    flag = 1;
                }
            }
            if(v == ee && flag == 1) break;
            if(maxn == INF) break;
            vis[v][flag] = 1;
            for(int u = head[v]; ~u; u = e[u].nxt){
                int j = e[u].to,w = e[u].w;
                if(!vis[j][0] && d[v][flag] + w < d[j][0]){
                    d[j][1] = d[j][0];
                    d[j][0] = d[v][flag] + w;
                    dp[j][1] = dp[j][0];
                    dp[j][0] = dp[v][flag];
                }else if(!vis[j][0] && d[v][flag] + w == d[j][0]){
                    dp[j][0] += dp[v][flag] ;
                }else if(!vis[j][1] && d[v][flag] + w < d[j][1]){
                    d[j][1] = d[v][flag] + w;
                    dp[j][1] = dp[v][flag];
                }else if(!vis[j][1] && d[v][flag] + w == d[j][1])
                    dp[j][1] += dp[v][flag];
                    //cout << dp[j][1] << " " << dp[j][0] << endl;
            }
        }
    }
    
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        int s ,ee ,t;
        int x, y , w;
        cin >> t;
        while(t--){
            cin >> n >> m;
            init();
            for(int i = 0;i < m ; i++){
                cin >> x >> y >> w;
                add_edge(x,y,w);
            }
            cin >> s >> ee;
            dijstra(s,ee);
            if(d[ee][0] + 1 == d[ee][1])
            cout << dp[ee][0] + dp[ee][1] << endl;
            else 
            cout << dp[ee][0] << endl;
        }
        return 0;
    }
  • 相关阅读:
    2017-10-22—光电二极管
    PCB微带线和带状线、共模信号和差模信号区别
    高速信号-Stub线与Via stub
    电子产品的接地问题
    锂电池保护板工作原理及过放过充短路保护解析
    MEMS-微机电系统
    COM和TTL电平的判决阈值-上下限
    三极管发射结并联二极管的作用
    SQL语句为什么要放中括号?
    如果让HTTP请求返回JSON格式的数据
  • 原文地址:https://www.cnblogs.com/DWVictor/p/11273005.html
Copyright © 2011-2022 走看看