HDU2807 Floyd
题意:从一点到另外一点的最短距离
因为点的个数较小 用floyd
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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...