题目地址:点击打开链接
思路:求一个点到其他点的最短距离用Dijkstra算法,而求任意一对顶点间的最短距离通常用Floyd算法,只不过时间复杂度会高一点,这里的距离是一个抽象的概念,还有就是当发现局部变量需要定义为全局变量时,记得把局部变量删除,不然错误很难找出来,调了一个小时发现,n既定义了全局变量,又定义了局部变量,结果导致n值不同
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int g[110][110],n;
void floyd()
{
int i,j,k;
for(k=1; k<=n; k++)
{
for(i=1; i<=n; i++)
{
if(g[i][k])//判断ik之间是否有边
{
for(j=1; j<=n; j++)
{
if(g[k][j] && i!= j)//i != j 不加也行,因为i = j时g[k][j]等于0,判断kj之间是否有边
{
if(g[i][j] == 0 || g[i][j] > g[i][k] + g[k][j])
g[i][j] = g[i][k] + g[k][j];
}
}
}
}
}
}
int main()
{
int m,i,j,num,time,flag,min1;
while(scanf("%d",&n) && n)
{
memset(g,0,sizeof(g));
for(i=1; i<=n; i++)
{
scanf("%d",&m);
for(j=0; j<m; j++)
{
scanf("%d%d",&num,&time);
g[i][num] = time;
}
}
floyd();
int min2 = 300000;
for(i=1; i<=n; i++)
{
flag = 1;
min1 = 0;
for(j=1; j<=n; j++)
{
if(i != j)
{
if(min1 < g[i][j])
min1 = g[i][j];
else if(g[i][j] == 0)
{
flag = 0;
break;
}
}
}
if(min1 < min2 && flag)
{
num = i;
min2 = min1;
}
}
if(min2 != 300000)
printf("%d %d\n",num,min2);
else
printf("disjoint\n");
}
return 0;
}