题目链接:哈利·波特的考试
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 105, INF = 0x3f3f3f3f;
int n, m;
int dist[N][N];//表示顶点i到顶点j的最短距离
void init()
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
if (i == j) dist[i][j] = 0;
else dist[i][j] = INF;
}
}
void createGraph()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
dist[a - 1][b - 1] = dist[b - 1][a - 1] = c;
}
}
void floyd()
{
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];//找到更短路径
}
}
}
int main()
{
init();
createGraph();
floyd();
int maxn = 0, minw = INF, minv = -1;
for (int i = 0; i < n; i++) {
maxn = 0;
for (int j = 0; j < n; j++) {
if (maxn < dist[i][j]) {
maxn = dist[i][j];
}
}
if (minw > maxn) {
minw = maxn;
minv = i;
}
}
if (minv == -1) {
printf("0\n");
}
else {
printf("%d %d", minv+1, minw);
}
system("pause");
return 0;
}