The Shortest Path
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1525 Accepted Submission(s): 475
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
Source
HDU 2009-4 Programming Contest
Recommend
lcy
只会暴力~~~~1500ms水过~
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 99999999
using namespace std;
int n,m;
int e[100][100][100];
int map[100][100];
int temp[100][100];
void floyd()
{
int j,i,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
void getmap()
{
int i,j,k;
memset(e,0,sizeof(e));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(k=1;k<=m;k++)
scanf("%d",&e[i][j][k]);
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
}
//printf("123\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
continue;
memset(temp,0,sizeof(temp));
int l1,l2,l3;
for(l1=1;l1<=m;l1++)
for(l2=1;l2<=m;l2++)
{
temp[l1][l2]=0;
for(l3=1;l3<=m;l3++)
temp[l1][l2]+=e[i][l1][l3]*e[j][l3][l2];
}
for(l1=1;l1<=n;l1++)
{
if(l1==i||l1==j)
continue;
int flag=1;
for(l2=1;l2<=m;l2++)
{
for(l3=1;l3<=m;l3++)
{
if(e[l1][l2][l3]!=temp[l2][l3])
{
flag=0;
break;
}
}
if(flag==0)
break;
}
if(flag)
map[i][l1]=1;
}
}
}
//printf("345\n");
floyd();
}
int main()
{
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
getmap();
int k;
scanf("%d",&k);
int i;
for(i=0;i<k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(map[a][b]>=inf)
printf("Sorry\n");
else
printf("%d\n",map[a][b]);
}
}
return 0;
}