uva567 - Risk(Risk游戏)
Floyd算法的简单应用,,
只不过这个题描述图的方法有点不好懂。
对于第i行,第一个数字n只是代表这一行还有多少数字要输入,说明节点i和接下来的n个节点都有路径。
例如第四行 【1 6】 ::表示节点4和节点6有路径,前面的1只是说明这一行上接下来有多少个数字。
代码如下:
#include <cstdio>
#define INF 1000000
int d[21][21];
int read_draph()
{
int b, n;
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 = 1; i <= 19; i++)
{
if(scanf("%d",&n)==EOF) return 0;
for(int j = 0; j < n; j++) {scanf("%d",&b); d[i][b] = d[b][i] = 1;}
}
return 1;
}
void flord()
{
for(int i = 1; i <= 20; i++)
for(int j = 1; j <= 20; j++)
for(int k = 1; k <= 20; k++)
if(d[j][k]>d[j][i]+d[i][k]) d[j][k] = d[j][i]+d[i][k];
}
int main ()
{
int t = 0;
while(read_draph())
{
int a, b;
flord();
int n;
printf("Test Set #%d\n",++t);
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
scanf("%d%d",&a,&b);
printf("%2d to %2d: %d\n",a,b,d[a][b]);
}
printf("\n");
}
return 0;
}
浙公网安备 33010602011771号