题目
输入
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;}
}