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 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2920310.html