最短路 poj1125

输入一个n表示有n个点,接下来n行,每行(假设是u)第一个数字m表示有m对数字(每一对两个数字v,w,表示u到v的时间w),后面接m对数字。找一个起点,它到其他点所花费的时间(求起点到其他点距离的最大值)是最小的(有点绕)。

思路:用floyd求出点和点的最小距离,然后遍历每个点为起点的情况,找出每个点作为起点到其他点所花费时间最大值里的最小值

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f
int map[105][105];
int n,m,k,t;
void floyd()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(map[i][j]>map[i][k]+map[k][j])
                map[i][j]=map[i][k]+map[k][j];
            }
        }
    }
}
int main()
{
    while((cin>>n)&&n)
    {
        int v,w;
        memset(map,inf,sizeof(map));
        for(int i=1;i<=n;i++)
        {
            cin>>m;
            for(int j=0;j<m;j++)
            {
                cin>>v>>w;
                if(map[i][v]>w)
                map[i][v]=w;
            }
        }
        floyd();
        int ans=inf,u=0;
        for(int i=1;i<=n;i++)
        {
            int max1=0;
            for(int j=1;j<=n;j++)
            {
                if(i!=j)
                {
                    if(map[i][j]!=inf)
                    max1=max(map[i][j],max1);
                    else
                    break;    //无法到达所有点,直接跳出循环 
                }
            }
            if(ans>max1)//更新ans和u 
            {
                ans=max1;
                u=i;
            }
        }
        if(ans!=inf)
        cout<<u<<' '<<ans<<endl;
        else
        cout<<"disjoint"<<endl;
    }
    return 0;
 } 

猜你喜欢

转载自www.cnblogs.com/6262369sss/p/9370273.html