zoj(1221

来源:互联网 发布:iphone桌面软件管理 编辑:程序博客网 时间:2024/05/26 09:53
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1221

这道题前19行给出城市的联通关系比如

1 3
  2 3 4
  3 4 5 6
  1 6
  1 7
  2 12 13
  1 8
  2 9 10
  1 11
  1 11
  2 12 17
  1 14
  2 14 15
  2 15 16
  1 16
  1 19
  2 18 19
  1 20
  1 20
  5
  1 20
  2 9
  19 5
  18 19
  16 20

第一行表示是第一个城市有1个城市和它相连,那个城市是3,然后又n的询问,询问u->v的最短路径= =。

考虑到数据只有20个城市,就用佛洛依德最短路

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int f[30][30];#define inf 9999999int main(){    int n,m;    int cnt=0;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<=22;i++)        {            for(int j=0;j<=22;j++)            f[i][j]=inf;        }        for(int i=0;i<n;i++)        {            scanf("%d",&m);            f[1][m]=1;            f[m][1]=1;        }        for(int i=2;i<=19;i++)        {            scanf("%d",&n);            for(int j=0;j<n;j++)            {                scanf("%d",&m);                f[i][m]=1;                f[m][i]=1;            }        }                 int t,ans=0,u,v;            for(int k=1;k<=20;k++)            {                for(int i=1;i<=20;i++)                {                    for(int j=1;j<=20;j++)                    if(f[i][k]+f[k][j]<f[i][j])                    f[i][j]=f[i][k]+f[k][j];                }            }                scanf("%d",&t);            printf("Test Set #%d\n",++cnt);             while(t--)            {                scanf("%d %d",&u,&v);                printf("%d to %d: %d\n",u,v,f[u][v]);              }            printf("\n");        }    return 0;}

 

0 0