IT民工
加油!

这道题是求图里任意两点的最短路的长度并且输出,用floyd算法可以解决这个问题,

但是题目的输入比较奇葩吧,从i = 1 到 i = 19,第 i 行先输入一个数字n,代表有几个数字,后面跟着

的数字都代表与 i 点直接连接的点,他们的距离为1.后面输入m,代表有多少对点,要求我们输出

每队点之间的最短路径长度。

#include<stdio.h>
#include<string.h>
#define INF 1000001

int n, m, d[25][25];
int x, y;
int min( int a, int b)
{
return a < b ? a : b;
}

int main()
{
int cnt = 0;
while( scanf( "%d", &n) == 1)
{
cnt ++;
for( int i = 1; i <= 20; i ++)
for( int j = 1; j <= 20; j ++)
{
if( i == j)
d[i][j] = 0;
else
d[i][j] = INF;
}
for(int i = 0; i < n; i ++) {
scanf( "%d", &x);
d[1][x] = d[x][1] = 1;
}
for( int i = 2; i <= 19; i ++)
{
scanf( "%d", &n);
while( n --)
{
scanf( "%d", &x);
d[x][i] = d[i][x] = 1;
}
}
for( int k = 1; k <= 20; k ++)
for( int i = 1; i <= 20; i ++)
for( int j = 1; j <= 20; j ++)
d[i][j] = min( d[i][j], d[i][k] + d[k][j]);
printf( "Test Set #%d\n", cnt);
scanf("%d", &n);
while( n --)
{
scanf( "%d%d", &x, &y);
printf( "%2d to %2d: %d\n", x, y, d[x][y]);
}
printf("\n");
}
return 0;
}

 

posted on 2011-11-25 23:41  找回失去的  阅读(254)  评论(0)    收藏  举报