HDU 5137 How Many Maos Does the Guanxi Worth(枚举+最短路径)

来源:互联网 发布:人脸识别算法 源代码 编辑:程序博客网 时间:2024/06/04 20:10

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=5137

题意:

给出一个无向图n个点m条边,断开其中的除了1和n之外的其中一个点的所有边,让最短路最长。

思路:

依次枚举除了1和n之外的其中一个点的所有边的最短路的结果,并且求出最大值。

AC代码:

#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define INF 0x3f3f3f3fconst int maxn = 35;int mp[maxn][maxn],vis[maxn],lowcost[maxn],tmp[maxn];int n,m;int dijstra(){    memset(vis,0,sizeof(vis));    vis[1]=1;    for(int i=1; i<=n; i++)        lowcost[i]=mp[1][i];    lowcost[1]=0;///注意赋值为0 否则会出错    for(int i=1; i<n; i++){        int mi=INF,flag;        for(int j=1; j<=n; j++){            if(!vis[j]&&lowcost[j]<mi){                mi=lowcost[j];                flag=j;            }        }        vis[flag]=1;        for(int j=1; j<=n; j++){///更新            if(!vis[j]&&lowcost[j]>lowcost[flag]+mp[flag][j])                lowcost[j]=lowcost[flag]+mp[j][flag];        }        ///if(flag==n) break;    }    return lowcost[n];}int main(){    while(cin>>n>>m){        if(n==0&&m==0) break;        for(int i=1; i<=n; i++)///初始化            for(int j=1; j<=n; j++)                mp[i][j]=INF;        int a,b,c;        for(int i=0; i<m; i++){            cin>>a>>b>>c;            mp[a][b]=mp[b][a]=c;        }        int ans=0;        for(int i=2; i<n; i++){            for(int j=1; j<=n; j++){///依次切断i点与所有点的联系,并暂时保存这些值,以便随后恢复                tmp[j]=mp[i][j];                mp[i][j]=mp[j][i]=INF;            }            ans=max(ans,dijstra());            for(int j=1; j<=n; j++)///恢复i与所有点的初始值                mp[i][j]=mp[j][i]=tmp[j];        }        if(ans==INF) cout<<"Inf"<<endl;        else cout<<ans<<endl;    }}

奇怪的是跑第二组测试数据有时候会崩溃,但是居然AC,应该数据比较水,找了几天的bug没找出来,麻烦大家看看,如果发现什么问题可以直接指出来,谢谢!

阅读全文
0 0
原创粉丝点击