POJ 3026 Borg Maze
最小生成树的题,这道题做得我快吐了,必须总结一下。
题目链接:http://poj.org/problem?id=3026
一开始我就看错了题,以为我方在任意位置都可以分裂,直接导致想不出来。后来搜了下,才发现看错题了。
题意就是给一个地图,要求从S开始,能经过所有A的最短路径。而且我方能够在S点或任意A点分裂成任意多个队列同时寻找A点。
果断BFS+prim啊,用bfs求出S和所有A之间 点对的最短距离,在用prim就好了。
不过方法很显然,不过我却TLE了好几次,都快恶心死了。
原因是我bfs用的是queue,和node结构体,然后就各种TLE啊。
后来全部改用数组就行了。
事实证明数组比STL快得多。
所以在实现复杂度相当的情况下,推荐使用数组。
STL只是方便而已。
下面先贴我TLE的代码,我用prim和krustra写了两次,都是TLE,跪。。。
1 Source Code 2 3 Problem: 3026 User: mingjiameng 4 Memory: N/A Time: N/A 5 Language: C++ Result: Time Limit Exceeded 6 Source Code 7 #include<stdio.h> 8 #include<iostream> 9 using namespace std; 10 #include<queue> 11 #include<math.h> 12 #include<algorithm> 13 #include<string.h> 14 #include<stdlib.h> 15 16 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 17 #define repAE(p,q,i) for( int (i)=(p); (i)<=(q); ++(i) ) 18 #define repD(p,q,i) for( int (i)=(p); (i)!=(q); --(i) ) 19 #define repDE(p,q,i) for( int (i)=(p); (i)>=(q); --(i) ) 20 #define range 55 21 #define MAXN 0x3f3f3f3f 22 23 int arr[range],col[range]; 24 int si,sj,order,hang,lie; 25 char maps[range][range] ; 26 int made[range][range] ; 27 bool confirm[range][range]; 28 bool dot[range]; 29 int gt[range][range]; 30 int flag[4][2]={ 1,0,-1,0,0,1,0,-1 }; 31 struct node{ 32 int x,y,d; 33 node(){} 34 node( int _x , int _y , int _d ) 35 : x(_x) , y(_y) , d(_d) {} 36 }; 37 node f[range]; 38 void bfs( int si,int sj ); 39 int prim(); 40 41 int main() 42 { 43 int test; scanf("%d",&test); 44 while(test--) 45 { 46 scanf("%d%d",&lie,&hang); 47 order=1; 48 repA(0,hang,i) 49 { 50 while( getchar() != '\n' ) ; 51 repA(0,lie,j) 52 { 53 maps[i][j] = getchar() ; 54 if(maps[i][j] == 'A') 55 { arr[order] = i; col[order++] = j; } 56 if( maps[i][j] == 'S' ) 57 { arr[0] = i; col[0] = j; } 58 59 } 60 61 } 62 // printf("get()OK!\n"); 63 // build map 64 //printf("%d\n",order); 65 repA(0,order,i) 66 { 67 bfs(arr[i] , col[i]) ; 68 repA(0,order,j) 69 made[i][j] = gt[arr[j] ][col[j] ] ; 70 } 71 printf("%d\n",prim() ) ; 72 } 73 //while(1); 74 return 0; 75 } 76 77 void bfs( int si, int sj ) 78 { 79 repA(0,hang,i) 80 repA(0,lie,j) 81 { 82 confirm[i][j]=true; 83 gt[i][j]=MAXN; 84 } 85 gt[si][sj]=0; 86 confirm[si][sj]=false; 87 int head=0,tail=0; 88 f[tail++]=node(si,sj,0); 89 node u; 90 int x,y; 91 while( tail > head ) 92 { 93 u=f[head++]; 94 repA(0,4,i) 95 { 96 x=u.x+flag[i][0]; 97 y=u.y+flag[i][1]; 98 if( x>=0&&x!=hang && y>=0&&y!=lie) 99 if( maps[x][y] != '#' && confirm[x][y] ) 100 { 101 f[tail++] = node(x,y,u.d+1); 102 confirm[x][y]=false; 103 gt[x][y]=u.d+1; 104 } 105 } 106 } 107 //printf("MADE!\n"); 108 return ; 109 } 110 111 int prim() 112 { 113 repA(0,order,i) dot[i]=true; 114 dot[0]=false; 115 int MINX,next,all=0; 116 repA(1,order,i) 117 { 118 MINX=MAXN; 119 repA(1,order,j) 120 if( dot[j] && made[0][j] < MINX ) 121 MINX = made[0][ next=j ] ; 122 all += MINX ; 123 dot[next] = false; 124 repA(1,order,j) 125 if( dot[j] && made[next][j] < made[0][j] ) 126 made[0][j] = made[next][j] ; 127 } 128 return all; 129 }
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 #include<queue> 5 #include<math.h> 6 #include<algorithm> 7 #include<string.h> 8 #include<stdlib.h> 9 10 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 11 #define repAE(p,q,i) for( int (i)=(p); (i)<=(q); ++(i) ) 12 #define repD(p,q,i) for( int (i)=(p); (i)!=(q); --(i) ) 13 #define repDE(p,q,i) for( int (i)=(p); (i)>=(q); --(i) ) 14 #define range 55 15 #define MAXN 0x3f3f3f3f 16 17 int arr[range],col[range]; 18 int si,sj,order,hang,lie; 19 char maps[range][range] ; 20 int made[range][range] ; 21 bool confirm[range][range]; 22 bool dot[range]; 23 int f[range]; 24 int gt[range][range]; 25 int flag[4][2]={ 1,0,-1,0,0,1,0,-1 }; 26 struct node{ 27 int x,y,d; 28 node(){} 29 node( int _x , int _y , int _d ) 30 : x(_x) , y(_y) , d(_d) {} 31 friend bool operator < (node n1, node n2) 32 { return n2.d < n1.d; } 33 }; 34 priority_queue<node> gray; 35 36 void bfs( int si,int sj ); 37 //int prim(); 38 int kruskal(); 39 int findset(int i); 40 41 int main() 42 { 43 int test; scanf("%d",&test); 44 while(test--) 45 { 46 scanf("%d%d",&lie,&hang); 47 order=1; 48 repA(0,hang,i) 49 { 50 while( getchar() != '\n' ) ; 51 repA(0,lie,j) 52 { 53 maps[i][j] = getchar() ; 54 if(maps[i][j] == 'A') 55 { arr[order] = i; col[order++] = j; } 56 if( maps[i][j] == 'S' ) 57 { arr[0] = i; col[0] = j; } 58 59 } 60 61 } 62 // printf("get()OK!\n"); 63 // build map 64 65 repA(0,order,i) 66 { 67 bfs(arr[i] , col[i]) ; 68 repA(0,order,j) 69 gray.push( node(i,j,gt[arr[j] ][col[j] ]) ) ; 70 } 71 72 printf("%d\n",kruskal() ); 73 //printf("%d\n",prim() ) ; 74 } 75 // while(1); 76 return 0; 77 } 78 79 void bfs( int si, int sj ) 80 { 81 repA(0,hang,i) 82 repA(0,lie,j) 83 { 84 confirm[i][j]=true; 85 gt[i][j]=MAXN; 86 } 87 gt[si][sj]=0; 88 confirm[si][sj]=false; 89 queue<node> gray; 90 gray.push( node(si,sj,0) ); 91 node u; 92 int x,y; 93 while( !gray.empty() ) 94 { 95 u=gray.front(); gray.pop(); 96 repA(0,4,i) 97 { 98 x=u.x+flag[i][0]; 99 y=u.y+flag[i][1]; 100 if( x>=0&&x!=hang && y>=0&&y!=lie) 101 if( maps[x][y] != '#' && confirm[x][y] ) 102 { 103 gray.push( node(x,y,u.d+1) ); 104 confirm[x][y]=false; 105 gt[x][y]=u.d+1; 106 } 107 } 108 } 109 //printf("MADE!\n"); 110 return ; 111 } 112 /* 113 int prim() 114 { 115 repA(0,order,i) dot[i]=true; 116 dot[0]=false; 117 int MINX,next,all=0; 118 repA(1,order,i) 119 { 120 MINX=MAXN; 121 repA(1,order,j) 122 if( dot[j] && made[0][j] < MINX ) 123 MINX = made[0][ next=j ] ; 124 all += MINX ; 125 dot[next] = false; 126 repA(1,order,j) 127 if( dot[j] && made[next][j] < made[0][j] ) 128 made[0][j] = made[next][j] ; 129 } 130 return all; 131 } 132 */ 133 134 int kruskal() 135 { 136 repA(0,order,i) f[i]=i; 137 int all=0,total=1,p,q; 138 node u; 139 while(total != order) 140 { 141 u=gray.top(); gray.pop(); 142 p=findset(u.x); q=findset(u.y); 143 if(p != q) 144 { 145 f[q] = p ; 146 all += u.d; 147 ++total; 148 } 149 } 150 return all; 151 } 152 153 int findset(int i) 154 { 155 if( f[i] != i ) 156 f[i] = findset( f[i] ); 157 return f[i]; 158 }
bfs的时候必须用数组,否则就会TLE
1 Source Code 2 3 Problem: 3026 User: mingjiameng 4 Memory: 280K Time: 16MS 5 Language: C++ Result: Accepted 6 Source Code 7 #include<stdio.h> 8 9 10 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 11 #define repAE(p,q,i) for( int (i)=(p); (i)<=(q); ++(i) ) 12 #define repD(p,q,i) for( int (i)=(p); (i)!=(q); --(i) ) 13 #define repDE(p,q,i) for( int (i)=(p); (i)>=(q); --(i) ) 14 #define range 110 15 #define MAXN 0x3f3f3f3f 16 17 int arr[range],col[range]; 18 int si,sj,order,hang,lie; 19 char maps[range][range] ; 20 int made[range][range] ; 21 bool confirm[range][range]; 22 bool dot[range]; 23 int gt[range][range]; 24 int flag[4][2]={ 1,0,-1,0,0,1,0,-1 }; 25 struct node{ 26 int x,y,d; 27 node(){} 28 node( int _x , int _y , int _d ) 29 : x(_x) , y(_y) , d(_d) {} 30 }; 31 int qx[2510],qy[2510]; 32 void bfs( int si,int sj ); 33 int prim(); 34 35 int main() 36 { 37 int test; scanf("%d",&test); 38 while(test--) 39 { 40 scanf("%d%d",&lie,&hang); 41 order=1; 42 repA(0,hang,i) 43 { 44 while( getchar() != '\n' ) ; 45 repA(0,lie,j) 46 { 47 maps[i][j] = getchar() ; 48 if(maps[i][j] == 'A') 49 { arr[order] = i; col[order++] = j; } 50 if( maps[i][j] == 'S' ) 51 { arr[0] = i; col[0] = j; } 52 53 } 54 55 } 56 // printf("get()OK!\n"); 57 // build map 58 //printf("%d\n",order); 59 repA(0,order,i) 60 { 61 bfs(arr[i] , col[i]) ; 62 repA(0,order,j) 63 made[i][j] = gt[arr[j] ][col[j] ] ; 64 } 65 printf("%d\n",prim() ) ; 66 } 67 //while(1); 68 return 0; 69 } 70 71 void bfs( int si, int sj ) 72 { 73 repA(0,hang,i) 74 repA(0,lie,j) 75 { 76 confirm[i][j]=true; 77 gt[i][j]=MAXN; 78 } 79 gt[si][sj]=0; 80 confirm[si][sj]=false; 81 int head=0,tail=0; 82 qx[tail]=si; qy[tail++]=sj; 83 84 int x,y,xx,yy; 85 while( tail > head ) 86 { 87 x=qx[head]; y=qy[head++]; 88 repA(0,4,i) 89 { 90 xx=x+flag[i][0]; 91 yy=y+flag[i][1]; 92 if( xx>=0&&xx!=hang && yy>=0&&yy!=lie) 93 if( maps[xx][yy] != '#' && confirm[xx][yy] ) 94 { 95 qx[tail]=xx; qy[tail++]=yy; 96 confirm[xx][yy]=false; 97 gt[xx][yy]=gt[x][y]+1; 98 } 99 } 100 } 101 //printf("MADE!\n"); 102 return ; 103 } 104 105 int prim() 106 { 107 repA(0,order,i) dot[i]=true; 108 dot[0]=false; 109 int MINX,next,all=0; 110 repA(1,order,i) 111 { 112 MINX=MAXN; 113 repA(1,order,j) 114 if( dot[j] && made[0][j] < MINX ) 115 MINX = made[0][ next=j ] ; 116 all += MINX ; 117 dot[next] = false; 118 repA(1,order,j) 119 if( dot[j] && made[next][j] < made[0][j] ) 120 made[0][j] = made[next][j] ; 121 } 122 return all; 123 }
To Be The Best Of Yourself