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 }
TLE的代码(prim
  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 }
第二次TLE(krustra)

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 }
AC的代码

 

posted on 2013-09-06 21:39  码农之上~  阅读(286)  评论(0编辑  收藏  举报

导航