zoukankan      html  css  js  c++  java
  • hdu 3986 Harry Potter and the Final Battle

    Harry Potter and the Final Battle

    Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 3319    Accepted Submission(s): 936


    Problem Description
    The final battle is coming. Now Harry Potter is located at city 1, and Voldemort is located at city n. To make the world peace as soon as possible, Of course, Harry Potter will choose the shortest road between city 1 and city n. But unfortunately, Voldemort is so powerful that he can choose to destroy any one of the existing roads as he wish, but he can only destroy one. Now given the roads between cities, you are to give the shortest time that Harry Potter can reach city n and begin the battle in the worst case.
     
    Input
    First line, case number t (t<=20).
    Then for each case: an integer n (2<=n<=1000) means the number of city in the magical world, the cities are numbered from 1 to n. Then an integer m means the roads in the magical world, m (0< m <=50000). Following m lines, each line with three integer u, v, w (u != v,1 <=u, v<=n, 1<=w <1000), separated by a single space. It means there is a bidirectional road between u and v with the cost of time w. There may be multiple roads between two cities.
     
    Output
    Each case per line: the shortest time to reach city n in the worst case. If it is impossible to reach city n in the worst case, output “-1”.
     
    Sample Input
    3
    4
    4
    1 2 5
    2 4 10
    1 3 3
    3 4 8
    3
    2
    1 2 5
    2 3 10
    2
    2
    1 2 1
    1 2 2
     
    Sample Output
    15
    -1
    2
     
    Author
    tender@WHU
     
    Source
     
    题意:一个无向图,n个点,m条边,输入m条边的起点,终点,距离,假设减去其中任意一条边,问各种情况下的最短路中最长的是哪条,可能有重边。
     
    这题和1595非常像,但是因为可能有重边(删去一边边,还是可以走另一条路的情况),所以必须使用邻接表写。
     
    附上代码:
     
      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 #define N 1005
      6 #define M 50005
      7 #define INF 0x3f3f3f3f
      8 using namespace std;
      9 
     10 struct Edge
     11 {
     12     int from,to,val;
     13     int next;
     14     bool used;
     15 } edge[M*2];
     16 
     17 int n,m,tol;
     18 int head[M*2],dis[N];
     19 bool vis[N];
     20 int flag;
     21 int path[N];
     22 
     23 void init()
     24 {
     25     tol=0;
     26     flag=0;
     27     memset(head,-1,sizeof(head));
     28     memset(path,-1,sizeof(path));
     29 }
     30 
     31 void addEdge(int u,int v,int val)
     32 {
     33     edge[tol].from=u;
     34     edge[tol].to=v;
     35     edge[tol].val=val;
     36     edge[tol].used=true;
     37     edge[tol].next=head[u];
     38     head[u]=tol++;
     39     edge[tol].from=v;
     40     edge[tol].to=u;
     41     edge[tol].val=val;
     42     edge[tol].used=true;
     43     edge[tol].next=head[v];
     44     head[v]=tol++;
     45 }
     46 
     47 void getmap()
     48 {
     49     scanf("%d%d",&n,&m);
     50     int a,b,c;
     51     while(m--)
     52     {
     53         scanf("%d%d%d",&a,&b,&c);
     54         addEdge(a,b,c);
     55     }
     56 }
     57 
     58 int spfa()
     59 {
     60     memset(dis,INF,sizeof(dis));
     61     memset(vis,false,sizeof(vis));
     62     queue<int>q;
     63     q.push(1);
     64     dis[1]=0;
     65     vis[1]=true;
     66     while(!q.empty())
     67     {
     68         int u=q.front();
     69         q.pop();
     70         vis[u]=false;
     71         for(int i=head[u]; i!=-1; i=edge[i].next)
     72         {
     73             int v=edge[i].to;
     74             if(edge[i].used)
     75                 if(dis[v]>dis[u]+edge[i].val)
     76                 {
     77                     dis[v]=dis[u]+edge[i].val;
     78                     if(!flag)
     79                         path[v]=i;   ///记录可以缩进的边,这些边可以改变总路程
     80                     if(!vis[v])
     81                     {
     82                         vis[v]=true;
     83                         q.push(v);
     84                     }
     85                 }
     86         }
     87     }
     88     return dis[n];
     89 }
     90 
     91 void newmap()
     92 {
     93     int i=n,j=-1;
     94     int ans=-1;
     95     while(path[i]!=-1)
     96     {
     97         j=path[i];
     98         edge[j].used=edge[j+1].used=false;
     99         int tmp=spfa();
    100         edge[j].used=edge[j+1].used=true;
    101         if(tmp>ans)
    102             ans=tmp;
    103         i=edge[j].from;
    104     }
    105     if(ans<INF)
    106         printf("%d
    ",ans);
    107     else
    108         printf("-1
    ");
    109 }
    110 
    111 int main()
    112 {
    113     int T;
    114     scanf("%d",&T);
    115     while(T--)
    116     {
    117         init();
    118         getmap();
    119         spfa();
    120         newmap();
    121     }
    122 }
  • 相关阅读:
    元素的ID和Name有什么区别???[转自"天道酬勤"]
    招聘时会问到的问题
    关于asp.net开发B/S应用系统的思索和讨论
    软件文档知多少?
    C# 编码规范和编程好习惯
    [转]多层结构来开发ASP.NET程序
    ASP.NET页面间的传值的几种方法
    为sql server 表数据生成创建的储存过程(生成insert 脚本)
    XHTML+CSS应用教程——利用CSS实现双语导航条
    XHTML+CSS应用教程——CSS实现文字的双影
  • 原文地址:https://www.cnblogs.com/pshw/p/5744437.html
Copyright © 2011-2022 走看看