hdu 2807 The Shortest Path(矩阵+floyd)

The Shortest Path

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3164    Accepted Submission(s): 1030


Problem Description
There are N cities in the country. Each city is represent by a matrix size of M*M. If city A, B and C satisfy that A*B = C, we say that there is a road from A to C with distance 1 (but that does not means there is a road from C to A).
Now the king of the country wants to ask me some problems, in the format:
Is there is a road from city X to Y?
I have to answer the questions quickly, can you help me?
 

 

Input
Each test case contains a single integer N, M, indicating the number of cities in the country and the size of each city. The next following N blocks each block stands for a matrix size of M*M. Then a integer K means the number of questions the king will ask, the following K lines each contains two integers X, Y(1-based).The input is terminated by a set starting with N = M = 0. All integers are in the range [0, 80].
 

 

Output
For each test case, you should output one line for each question the king asked, if there is a road from city X to Y? Output the shortest distance from X to Y. If not, output "Sorry".
 

 

Sample Input
3 2
1 1
2 2
1 1
1 1
2 2
4 4
1
1 3
3 2
1 1
2 2
1 1
1 1
2 2
4 3
1
1 3
0 0
 

 

Sample Output
1 Sorry
 

 

Source
 

 

题意:先输入n,m,接着输入n个m*m的矩阵,再输入k表示k次询问,接下来输入k行输入x,y,询问x点是否能到y点,可以则输出最短路。 当矩阵 A*B = C 的时候,A点到C点的距离是1.
 
先处理矩阵,建图,此题数据只有85,直接用floyd就好。
 
附上代码:
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define N 85
 6 #define INF 0x3f3f3f3f
 7 using namespace std;
 8 int n,m;
 9 int map[N][N];
10 int a[N][N][N],tem[N][N];
11 
12 void floyd()
13 {
14     int i,j,k;
15     for(k=1; k<=n; k++)
16         for(i=1; i<=n; i++)
17             for(j=1; j<=n; j++)
18                 if(map[i][j]>map[i][k]+map[k][j])
19                     map[i][j]=map[i][k]+map[k][j];
20 }
21 
22 void getmap()
23 {
24     int i,j,k,x,y,z;
25     for(i=1; i<=n; i++)
26         for(j=1; j<=m; j++)
27             for(k=1; k<=m; k++)
28                 scanf("%d",&a[i][j][k]);
29     for(i=0; i<=n; i++)
30         for(j=0; j<=n; j++)
31             if(i==j) map[i][j]=0;
32             else   map[i][j]=INF;
33     for(i=1; i<=n; i++)
34     {
35         for(j=1; j<=n; j++)
36         {
37             if(i==j) continue;
38             memset(tem,0,sizeof(tem));
39             for(x=1; x<=m; x++)
40                 for(y=1; y<=m; y++)
41                 {
42                     tem[x][y]=0;
43                     for(z=1; z<=m; z++)   ///矩阵计算
44                         tem[x][y]+=a[i][x][z]*a[j][z][y];
45                 }
46             for(x=1; x<=n; x++)
47             {
48                 if(x==i||x==j)
49                     continue;
50                 int flag=1;
51                 for(y=1; y<=m; y++)
52                 {
53                     for(z=1; z<=m; z++)
54                     {
55                         if(tem[y][z]!=a[x][y][z]) ///比较是否完全相同
56                         {
57                             flag=0;
58                             break;
59                         }
60                     }
61                     if(!flag)
62                         break;
63                 }
64                 if(flag)
65                     map[i][x]=1;
66             }
67         }
68     }
69     floyd();
70 }
71 int main()
72 {
73     int i,j,k,x,y;
74     while(~scanf("%d%d",&n,&m))
75     {
76         if(n==0&&m==0)
77             break;
78         getmap();
79         scanf("%d",&k);
80         while(k--)
81         {
82             scanf("%d%d",&x,&y);
83             if(map[x][y]<INF)
84                 printf("%d\n",map[x][y]);
85             else
86                 printf("Sorry\n");
87         }
88     }
89     return 0;
90 }

 

posted @ 2016-08-06 15:28  lucky_少哖  阅读(203)  评论(0编辑  收藏  举报