hdu 2807 The Shortest Path

http://acm.hdu.edu.cn/showproblem.php?pid=2807

 第一次做矩阵乘法,没有优化超时,看了别人的优化的矩阵乘法,就过了。

 1 #include <cstdio>

 2 #include <iostream>

 3 #include <cstring>

 4 #include <algorithm>

 5 #define maxn 100

 6 using namespace std;

 7 const int inf=1<<28;

 8 

 9 int n,m,t1,x,y;

10 int g[maxn][maxn];

11 int d[maxn][maxn];

12 int aa[maxn][maxn][maxn];

13 

14 void deal(int a,int b)

15 {

16     for(int i=1; i<=m; i++)

17     {

18         d[0][i]=0;

19         for(int j=1; j<=m; j++)

20         {

21             d[0][i]+=(aa[a][i][j]*d[b][j]);

22         }

23     }

24     for(int i=1; i<=n; i++)

25     {

26         if(i==a||i==b) continue;

27         bool flag=false;

28         for(int k=1; k<=m; k++)

29         {

30             if(d[0][k]!=d[i][k])

31             {

32                 flag=true;

33                 break;

34             }

35         }

36         if(!flag) g[a][i]=1;

37     }

38 }

39 

40 

41 int main()

42 {

43     while(cin>>n>>m)

44     {

45         if(n==0&&m==0) break;

46         for(int i=1; i<=n; i++)

47         {

48             for(int j=1; j<=m; j++)

49             {

50                 d[i][j]=0;

51                 for(int k=1; k<=m; k++)

52                 {

53                     scanf("%d",&aa[i][j][k]);

54                     d[i][j]+=(aa[i][j][k]*k);

55                 }

56             }

57         }

58         for(int i=1; i<=n; i++)

59         {

60             for(int j=i+1; j<=n; j++)

61             {

62                 g[i][j]=g[j][i]=inf;

63             }

64         }

65         for(int i=1; i<=n; i++)

66         {

67             for(int j=1; j<=n; j++)

68             {

69                 if(i==j) continue;

70                 deal(i,j);

71             }

72         }

73         for(int k=1; k<=n; k++)

74         {

75             for(int i=1; i<=n; i++)

76             {

77                 for(int j=1; j<=n; j++)

78                 {

79                     if(g[i][j]>g[i][k]+g[k][j])

80                     {

81                         g[i][j]=g[i][k]+g[k][j];

82                     }

83                 }

84             }

85         }

86         scanf("%d",&t1);

87         for(int i=0; i<t1; i++)

88         {

89             scanf("%d%d",&x,&y);

90             if(g[x][y]!=inf) printf("%d\n",g[x][y]);

91             else printf("Sorry\n");

92         }

93     }

94     return 0;

95 }
View Code

 

你可能感兴趣的:(Path)