zoukankan      html  css  js  c++  java
  • HDU 6181 第k短路

    Two Paths

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 153428/153428 K (Java/Others)
    Total Submission(s): 525    Accepted Submission(s): 265


    Problem Description
    You are given a undirected graph with n nodes (numbered from 1 to n) and m edges. Alice and Bob are now trying to play a game. 
    Both of them will take different route from 1 to n (not necessary simple).
    Alice always moves first and she is so clever that take one of the shortest path from 1 to n.
    Now is the Bob's turn. Help Bob to take possible shortest route from 1 to n.
    There's neither multiple edges nor self-loops.
    Two paths S and T are considered different if and only if there is an integer i, so that the i-th edge of S is not the same as the i-th edge of T or one of them doesn't exist.
     
    Input
    The first line of input contains an integer T(1 <= T <= 15), the number of test cases.
    The first line of each test case contains 2 integers n, m (2 <= n, m <= 100000), number of nodes and number of edges. Each of the next m lines contains 3 integers a, b, w (1 <= a, b <= n, 1 <= w <= 1000000000), this means that there's an edge between node a and node b and its length is w.
    It is guaranteed that there is at least one path from 1 to n.
    Sum of n over all test cases is less than 250000 and sum of m over all test cases is less than 350000.
     
    Output
    For each test case print length of valid shortest path in one line.
     
    Sample Input
    2 3 3 1 2 1 2 3 4 1 3 3 2 1 1 2 1
     
    Sample Output
    5 3
    Hint
    For testcase 1, Alice take path 1 - 3 and its length is 3, and then Bob will take path 1 - 2 - 3 and its length is 5. For testcase 2, Bob will take route 1 - 2 - 1 - 2 and its length is 3
     
    Source
     
    题解:无向图求第k短路(非次短路) 模板
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<cstring>
      5 #include<algorithm>
      6 #include<map>
      7 #include<queue>
      8 #include<stack>
      9 #include<vector>
     10 #include<set>
     11 using namespace std;
     12 typedef long long ll;
     13 typedef pair<ll,int> P;
     14 const int maxn=2e5+100,maxm=2e5+100,inf=0x3f3f3f3f,mod=1e9+7;
     15 const ll INF=1e17+7;
     16 struct edge
     17 {
     18     int from,to;
     19     ll w;
     20 } pre[maxn];
     21 vector<edge>G[maxn],T[maxn];
     22 priority_queue<P,vector<P>,greater<P> >q;
     23 ll dist[maxn];
     24 
     25 void addedge(int u,int v,ll w)
     26 {
     27     G[u].push_back((edge)
     28     {
     29         u,v,w
     30     });
     31     T[v].push_back((edge)
     32     {
     33         v,u,w
     34     });
     35 }
     36 void dij(int s)
     37 {
     38     dist[s]=0LL;
     39     q.push(P(dist[s],s));
     40     while(!q.empty())
     41     {
     42         P p=q.top();
     43         q.pop();
     44         int u=p.second;
     45         for(int i=0; i<T[u].size(); i++)
     46         {
     47             edge e=T[u][i];
     48             if(dist[e.to]>dist[u]+e.w)
     49             {
     50                 dist[e.to]=dist[u]+e.w;
     51                 q.push(P(dist[e.to],e.to));
     52             }
     53         }
     54     }
     55 }
     56 struct node
     57 {
     58     int to;
     59     ///g(p)为当前从s到p所走的路径的长度;dist[p]为点p到t的最短路的长度;
     60     ll g,f;///f=g+dist,f(p)的意义为从s按照当前路径走到p后再走到终点t一共至少要走多远;
     61     bool operator<(const node &x ) const
     62     {
     63         if(x.f==f) return x.g<g;
     64         return x.f<f;
     65     }
     66 };
     67 
     68 ll A_star(int s,int t,int k)
     69 {
     70     priority_queue<node>Q;
     71     if(dist[s]==INF) return -1;
     72     int cnt=0;
     73     if(s==t) k++;
     74     ll g=0LL;
     75     ll f=g+dist[s];
     76     Q.push((node)
     77     {
     78         s, g, f
     79     });
     80     while(!Q.empty())
     81     {
     82         node x=Q.top();
     83         Q.pop();
     84         int u=x.to;
     85         if(u==t) cnt++;
     86         if(cnt==k) return x.g;
     87         for(int i=0; i<G[u].size(); i++)
     88         {
     89             edge e=G[u][i];
     90             ll g=x.g+e.w;
     91             ll f=g+dist[e.to];
     92             Q.push((node)
     93             {
     94                 e.to, g, f
     95             });
     96         }
     97     }
     98     return -1;
     99 }
    100 void init(int n)
    101 {
    102     for(int i=0; i<=n+10; i++) G[i].clear(),T[i].clear();
    103 }
    104 int main()
    105 {
    106     int n,m;
    107     int t;
    108     scanf("%d",&t);
    109     while(t--){
    110     scanf("%d%d",&n,&m);
    111     for(int i=1; i<=m; i++)
    112     {
    113         int u,v;
    114         ll w;
    115         scanf("%d%d%lld",&u,&v,&w);
    116         addedge(u,v,w);
    117         addedge(v,u,w);
    118     }
    119     for(int i=0; i<=n; i++) dist[i]=INF;
    120     dij(n);
    121     printf("%lld
    ",A_star(1,n,2));
    122     init(n);
    123     }
    124     return 0;
    125 }
  • 相关阅读:
    jdk1.8安装教程
    实现负载均衡的两种方式
    Java中ArrayList和LinkedList区别
    做一个英译中的命令行工具
    在 IDEA 中运行 Spark 程序报错:Multiple sources found for text.......please specify the fully qualified class name
    Android消息处理:EventBus、BroadCast和Handler-优缺点比较(转)
    C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter、转载)
    Android相关知识
    物联网相关知识
    Mqtt相关知识
  • 原文地址:https://www.cnblogs.com/hsd-/p/7427958.html
Copyright © 2011-2022 走看看