HDU 1595 find the longest of the shortest

题意:从1到n去点一条边,最坏的情况下的最短路是多少

题解:先跑一遍最短路,记录途径的每条路,然后再遍历去点最短路中的每条路,再继续跑最短路(因为不是关键路径的路去掉了对最短路没影响)。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf=0x3f3f3f3f;
 4 int mm[1010][1010];
 5 int vis[1010],dis[1010],link[1010];
 6 int n,m;
 7 bool flag=0;
 8 void dijkstra(int s)
 9 {
10     memset(vis,0,sizeof(vis));
11     memset(dis,0x3f,sizeof(dis));
12     int minn,pos;
13     dis[s]=0;
14     for(int i=0;i<=n;i++)
15     {
16         minn=inf;
17         for(int j=1;j<=n;j++)
18         {
19             if(dis[j]<minn&&!vis[j])
20             {
21                 minn=dis[j];
22                 pos=j;
23             }
24         }
25         vis[pos]=1;
26         for(int j=1;j<=n;j++)
27         {
28             if(dis[pos]+mm[pos][j]<dis[j])
29             {
30                 dis[j]=dis[pos]+mm[pos][j];
31                 if(flag)
32                     link[j]=pos;
33             }
34         }
35     }
36 }
37 int main()
38 {
39     while(~scanf("%d%d",&n,&m))
40     {
41         memset(mm,0x3f,sizeof(mm));
42         memset(link,0,sizeof(link));
43         while(m--)
44         {
45             int a,b,w;
46             scanf("%d%d%d",&a,&b,&w);
47             mm[a][b]=mm[b][a]=w;
48         }
49         flag=!flag;
50         dijkstra(1);
51         flag=!flag;
52         int ans=dis[n];
53         for(int i=n;i!=1;i=link[i])
54         {
55             int temp=mm[i][link[i]];
56             mm[i][link[i]]=mm[link[i]][i]=inf;
57             dijkstra(1);
58             ans=max(ans,dis[n]);
59             mm[i][link[i]]=mm[link[i]][i]=temp;
60         }
61         printf("%d\n",ans);
62     }
63 }

 

posted @ 2017-10-08 19:29  Kearon  阅读(182)  评论(0编辑  收藏  举报