#include<stdio.h>
#define INF 0x3fffffff
int mp[108][108];
int N,M;
void Floyd()
{
for (int k = 1;k<=N;k++)
for (int i = 1;i<=N;i++)
for (int j = 1;j<=N;j++)
{
if(mp[i][j]>mp[i][k]+mp[k][j] && mp[i][k]!=INF && mp[k][j]!=INF)
{
mp[i][j] = mp[i][k]+mp[k][j];
}
}
}
int vis[108];
void DFS(int s)
{
if (!vis[s]) vis[s] = 1;
for (int i = 1;i<=N;i++)
{
if (mp[s][i] != INF && !vis[i]) DFS(i);
}
}
int main()
{
scanf ("%d%d",&N,&M);
for (int i = 0;i<=N;i++)
for (int j = 0;j<=N;j++)
{
mp[i][j]=INF;
if (i==j) mp[i][j]=0;//自己到自己距离为0
}
while (M--)
{
int a,b,c;
scanf ("%d%d%d",&a,&b,&c);
mp[a][b] = c;
mp[b][a] = c;
}
DFS(1);//用dfs判断联通图
for (int i = 1;i<=N;i++)
{
if (vis[i]==0)
{
printf ("0");
return 0;
}
}
Floyd();
//这次才对 上面的Floyd都写错了
// for (int i = 1;i<=N;i++)
// {
// for (int j = 1;j<=N;j++)
// {
// if (mp[i][j]==INF) printf("0 ");
// else printf ("%d ",mp[i][j]);
// }
// printf ("\n");
// }
int min = INF;
int pos;
for(int i =1;i<=N;i++)
{
int max = 0;
for (int j = 1;j<=N;j++)
{
max = max > mp[i][j] ? max : mp[i][j];
}
if (min > max)
{
min = max;
pos = i;
}
}
printf ("%d %d",pos,min);
}
//啧啧啧 就是强 想通了之后 一遍过
/*
这就是距离的内容了 取每一行的最大值 然后在里面取最小值
0 1 70 61 81 51
1 0 71 60 80 50
70 71 0 70 120 80
61 60 70 0 50 60
81 80 120 50 0 60
51 50 80 60 60 0
*/
关键就是考察的Floyd算法,全源最短路问题,需要注意的是,和前面不一样,这里只需要设置一个数组记住图,而修改的过程也是在图上进行的,感觉这样会更好一些,图里面的数据都是存储最短的情况,而这个算法也是非常简单易理解,和动态规划的思路有点像,应该也是取遍所有可能,然后选择性的赋值。
唯一缺点就是复杂度达到O(n*n*n) 基本上200范围内还好说。