此题用了floyd,思路非常简单,但是要注意两点:
- 注意读题,每个条件都得注意到
- 注意思路复杂不如思路简单,比如在取得每行最大值的时候,原来想先判断每一行是否有不可达的连通点,有则直接continue,再在连通点中判断最大值(错误原因暂时不想找了orz),正确方法是直接找出最大值,如果无穷大就直接不改变当前选取的动物就行了。
#include <stdio.h>
#include <string.h>
int N,M;
int graph[100][100];
//测试用
void print()
{
for(int i=0;i<N;++i)
{
for(int j=0;j<N;++j)
printf("%d\t",graph[i][j]);
printf("\n");
}
}
int main()
{
scanf("%d %d",&N,&M);
for(int i=0;i<N;++i)
for(int j=0;j<N;++j)
graph[i][j] = 10000000;
for(int i=0;i<M;++i)
{
int from,to,dis;
scanf("%d %d %d",&from,&to,&dis);
graph[from-1][to-1] = graph[to-1][from-1] = dis;
}
for(int k=0;k<N;++k)
{
for(int i=0;i<N;++i)
{
for(int j=0;j<N;++j)
if(graph[i][k] +graph[k][j] < graph[i][j])
graph[i][j] = graph[i][k] +graph[k][j];
}
}
int bring = -1;
int maxmax = 10000000;
for(int i=0;i<N;++i) graph[i][i] = 0;
for(int i=0;i<N;++i)
{
int max = 0;
for(int j=0;j<N;++j)
{
if(graph[i][j] > max)
max = graph[i][j];
}
if(max < maxmax) {bring = i;maxmax = max;}
}
//print();
if(bring == -1)
{
printf("0\n");
}
else
printf("%d %d",bring+1,maxmax);
return 0;
}