codevs1020

题目地址:http://codevs.cn/problem/1020/

分析:

枚举+floyd

代码:

#include <stdio.h>  

#include <string.h>  
#define MAXN 500  
#define INF 10000000  
int g[MAXN][MAXN],n; //g[i][j]=从i到j的最短路  
int min(int a,int b)  
{  
    if(a<b)  
        return a;  
    return b;  
}  
void init()  
{  
    int a,b,t;  
    memset(g,-1,sizeof(g));  
    scanf("%d",&n);  
    while(scanf("%d%d%d",&a,&b,&t)!=EOF)  
    {  
        g[a][b]=t;  
        g[b][a]=t;  
    }  
}  
void floyd() //求各点间最短路径  
{  
    int i,j,k;  
    for(k=1;k<=n;k++)  
    {  
        for(i=1;i<=n;i++)  
        {  
            if(i!=k)  
            {  
                for(j=1;j<=n;j++)  
                {  
                    if(i!=j&&j!=k&&g[i][k]!=-1&&g[k][j]!=-1)  
                    {  
                        if(g[i][j]>g[i][k]+g[k][j]||g[i][j]==-1)  
                            g[i][j]=g[i][k]+g[k][j];  
                    }  
                }  
            }  
        }  
    }  
}  
int getmax(int a,int b) //获得以蜘蛛在a、b两点找到飞蛾的最坏情况(两点各到另一点的距离最小值 的最大值)  
{  
    int i,f=0;  
    for(i=1;i<=n;i++)  
        if(min(g[a][i],g[b][i])>f)  
            f=min(g[a][i],g[b][i]);  
    return f;  
}  
void solve() //枚举两个蜘蛛出现的所有可能位置的最坏情况getmax最小值  
{  
    int a,b,minn=INF,mina,minb;  
    for(a=1;a<=n;a++)  
    {  
        for(b=1;b<=n;b++)  
        {  
            if(a!=b)  
            {  
                if(getmax(a,b)<minn)  
                {  
                    mina=a;  
                    minb=b;  
                    minn=getmax(a,b);  
                }  
            }  
        }  
    }  
    printf("%d %d\n",mina,minb);  
}  
int main()  
{  
    init();  
    floyd();  
    solve();  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值