HDU2807 Floyd

题意:从一点到另外一点的最短距离

因为点的个数较小 用floyd

View Code
  1 #include<stdio.h>

  2 #include<string.h>

  3 #include<stdlib.h>

  4 #include<algorithm>

  5 #include<queue>

  6 using namespace std;

  7 const int maxn = 81;

  8 struct node{

  9     int mat[ maxn ][ maxn ];

 10 }a[ maxn ];

 11 struct node2{

 12     int mat[ maxn ][ maxn ];

 13 }aa[ maxn ][ maxn ];

 14 int mat[ maxn ][ maxn ];

 15 int n,m;

 16 const int inf = 9999999;

 17 

 18 void judge( int num1,int num2 ){

 19     for( int i=0;i<m;i++ ){

 20         for( int j=0;j<m;j++ ){

 21             int sum=0;

 22             for( int k=0;k<m;k++ ){

 23                 sum+=(a[num1].mat[i][k]*a[num2].mat[k][j]);

 24             }

 25             aa[num1][num2].mat[i][j]=sum;

 26         }

 27     }

 28     return ;

 29 }

 30 

 31 int comp( int x,int y,int temp ){

 32     for( int i=0;i<m;i++ ){

 33         for( int j=0;j<m;j++ ){

 34             if( aa[x][y].mat[i][j]!=a[temp].mat[i][j] )

 35             {

 36                 return -1;

 37             }

 38         }

 39     }

 40     return 1;

 41 }

 42 

 43 

 44 void get_map(){

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

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

 47             mat[i][j]=inf;

 48     for( int i=1;i<=n;i++ ){

 49         for( int j=1;j<=n;j++ ){

 50             if( i!=j )

 51                 judge( i,j );

 52         }

 53     }

 54     for( int i=1;i<=n;i++ ){

 55         for( int j=1;j<=n;j++ ){

 56             for( int k=1;k<=n;k++ ){

 57                 if( i!=j&&i!=k&&j!=k&&comp( i,j,k )==1 )

 58                     mat[i][k]=1;

 59             }

 60         }

 61     }

 62 }

 63 

 64      /*

 65     int bfs( int x,int y ){

 66         int dis[ maxn ];

 67         queue<int>q;

 68         while( !q.empty() )

 69             q.pop();

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

 71             dis[i]=inf;

 72         dis[x]=0;

 73         q.push(x);

 74         while( !q.empty() ){

 75             int now=q.front();

 76             q.pop();

 77             for( int i=1;i<=n;i++ ){

 78                 if( i!=now&&mat[now][i]==1&&dis[i]>dis[now]+1 ){

 79                     dis[i]=dis[ now ]+1;

 80                     q.push( i );

 81                 }

 82             }

 83         }

 84         if( dis[y]>=inf )

 85             return -1;

 86         else

 87             return dis[y];

 88     }*/

 89 void floyd(){

 90     for( int i=1;i<=n;i++ ){

 91         for( int j=1;j<=n;j++ ){

 92             for( int k=1;k<=n;k++ ){

 93                 if( mat[i][k]!=0&&mat[k][j]!=0&&mat[i][j]>mat[i][k]+mat[k][j] ){

 94                     mat[i][j]=mat[i][k]+mat[k][j];

 95                 }

 96             }

 97         }

 98     }

 99 }

100 

101 int main(){

102     //int n,m;

103     while( scanf("%d%d",&n,&m)==2,n+m ){

104         for( int k=1;k<=n;k++ ){

105             for( int i=0;i<m;i++ ){

106                 for( int j=0;j<m;j++ ){

107                     scanf("%d",&a[k].mat[i][j]);

108                 }

109             }

110         }

111         get_map();

112         floyd();

113         int ca;

114         scanf("%d",&ca);

115         while( ca-- ){

116             int x,y;

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

118             if( mat[x][y]!=inf )

119                 printf("%d\n",mat[x][y]);

120             else

121                 printf("Sorry\n");

122             /*

123             int ans=bfs(x,y);

124             if( ans==-1 )

125                 printf("Sorry\n");

126             else

127                 printf("%d\n",ans);

128             */

129         }

130     }

131     return 0;

132 }

 

你可能感兴趣的:(floyd)