数据结构算法——1093. 哈利·波特的考试

题目

在这里插入图片描述
输入
6 11
3 4 70
1 2 1
5 4 50
2 6 50
5 6 60
1 3 70
4 6 60
3 6 80
5 1 100
2 4 60
5 2 80

输出
4 70

思路

floyd算法
二重循环
然后再把矩阵中每一行的最大值取出来——从起始到这个点必定经过所有点
若干个每一行最大值的最小值就是需要的最小值动物
(注意这是有向图,所以不能用对称矩阵

代码

#include<iostream>
#include<cstring>
using namespace std;

#define INF 0x3f3f3f3f

int main()
{//
    int N, M;
    cin >> N >> M;
    int ve[200][200];
    memset(ve, INF, sizeof(ve));
    for(int i = 1; i <= N; i++)
        ve[i][i] = 0;

    for(int i = 0; i < M; i++)
    {
        int start,end,cost;
        cin >> start >> end >> cost;
        if(cost < ve[start][end])
            ve[start][end] = ve[end][start] = cost;
    }

    for(int mid = 1; mid <= N; mid++)
        for(int s = 1; s <= N; s++)
            for(int e = 1; e <= N; e++)
            {
                int t = ve[s][mid] + ve[mid][e];
                if(t < ve[s][e])
                    ve[s][e] = t;
            }
    

    int MIN = INF;
    int index = INF;
    for(int start = 1; start <= N; start++)
    {
        int MAX = 0;
        for(int end = 1; end <= N; end++)
        {
            if(ve[start][end] > MAX)
            {
                MAX = ve[start][end];
            }
        }
        if(MIN > MAX)
        {
            MIN = MAX;
            index = start;
        }//由于start是从1开始算的,所以少了一步需要检验下标最小的步骤
     

    }
    if(MIN == INF)
        {cout << 0;}
    else
        {cout << index << " " << MIN;}
        
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值