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

题目:点击打开链接

 

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

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

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值