zoj(1221
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 9999999 int 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; }