POJ 3026 Borg Maze bfs + 最小生成树

原创 2015年07月06日 18:35:17

题意:说有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走。从起点‘S’出发。在起点和A处可以分叉,问找到所有的外星人的最短路径是多少。

思路:此题其实不是太难了,可以先用bfs搜索图,然后建边,求出一点到另一点的距离,然后求最小生成树即可。最小生成树用prime和kruskal均可。关键是这道题输入需要注意。首先先输入的是列,然后是行。其次是输入列和行的后面有可能有空格,因此需要gets一下。还有就是输入字母时,因为有空格,所以不要用cin,用scanf。

代码:

  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <string.h>  
  4. #include <algorithm>  
  5. #include <queue>  
  6. using namespace std;  
  7.   
  8. #define CLR(arr,val) memset(arr,val,sizeof(arr))  
  9. const int N = 55*2;  
  10. int vis[N*2][N*2],map[N][N],father[N*2];  
  11. struct edge{  
  12.     int lp,rp,value;  
  13. }ee[15050];  
  14. struct point{  
  15.     int x,y,step;  
  16. }pp[N*2];  
  17. int row,col,numedge,numpoint;  
  18. int addx[4] = {0,0,1,-1};  
  19. int addy[4] = {1,-1,0,0};  
  20. bool fun(int x,int y){  
  21.     if(map[x][y] >= 0 && !vis[x][y])  
  22.         return true;  
  23.     return false;  
  24. }  
  25. void bfs(int posx,int posy,int id){  
  26.     CLR(vis,0);  
  27.     queue<point> qq;  
  28.     point newpp;  
  29.     newpp.x = posx;  
  30.     newpp.y = posy;  
  31.     newpp.step = 0;  
  32.     vis[posx][posy] = 1;  
  33.     qq.push(newpp);  
  34.     while(!qq.empty()){  
  35.         point tpp = qq.front();  
  36.         qq.pop();  
  37.         int tx = tpp.x;  
  38.         int ty = tpp.y;  
  39.         for(int i = 1; i < numpoint; ++i){  
  40.             if(pp[i].x == tx && pp[i].y == ty){  
  41.                 ee[numedge].lp = id;  
  42.                 ee[numedge].rp = i;  
  43.                 ee[numedge].value = tpp.step;  
  44.                 numedge++;  
  45.             }  
  46.         }  
  47.         for(int i = 0; i < 4; ++i){  
  48.           int newx = tx + addx[i];  
  49.           int newy = ty + addy[i];  
  50.           if(fun(newx,newy)){  
  51.             vis[newx][newy] = 1;  
  52.             point newp;  
  53.             newp.x = newx;  
  54.             newp.y = newy;  
  55.             newp.step = tpp.step + 1;  
  56.             qq.push(newp);  
  57.           }  
  58.         }  
  59.     }  
  60. }  
  61. bool cmp(edge a,edge b){  
  62.     return a.value < b.value;  
  63. }  
  64. int find(int x){  
  65.     if(x == father[x])  
  66.         return x;  
  67.     return find(father[x]);  
  68. }  
  69. bool Union_Set(int x,int y){  
  70.     int fx = find(x);  
  71.     int fy = find(y);  
  72.     if(fx == fy)  
  73.         return false;  
  74.     else{  
  75.       father[fx] = fy;  
  76.       return true;  
  77.     }  
  78. }  
  79. int kruskal(){  
  80.     for(int i = 1; i <= numpoint; ++i)  
  81.         father[i] = i;  
  82.     int sum = 0;  
  83.     for(int i = 0; i < numedge; ++i){  
  84.        int lx = ee[i].lp;  
  85.        int rx = ee[i].rp;  
  86.        if(Union_Set(lx,rx))  
  87.            sum += ee[i].value;  
  88.     }  
  89.   
  90.     return sum;  
  91. }  
  92. int main(){  
  93.     //freopen("1.txt","r",stdin);  
  94.     int numcase;  
  95.     scanf("%d",&numcase);  
  96.     char ch[N];  
  97.     while(numcase--){  
  98.         CLR(map,-1);  
  99.         for(int i = 0; i < N*2; ++i){  
  100.           pp[i].x = pp[i].y = pp[i].step = 0;  
  101.         }  
  102.         for(int i = 0; i < 15000; ++i){  
  103.           ee[i].lp = ee[i].rp = ee[i].value = 0;  
  104.         }  
  105.       numpoint = 1;  
  106.       numedge = 0;  
  107.       scanf("%d%d",&col,&row);  
  108.       gets(ch);  
  109.       char ss;  
  110.       for(int i = 1; i <= row; ++i){  
  111.           for(int j = 1; j <= col; ++j){  
  112.             scanf("%c",&ss);  
  113.             if(ss == '#')  
  114.                 map[i][j] = -1;  
  115.             else if(ss == ' ')  
  116.                 map[i][j] = 0;  
  117.             else{  
  118.               map[i][j] = 1;  
  119.               pp[numpoint].x = i;  
  120.               pp[numpoint].y = j;  
  121.               numpoint++;  
  122.             }  
  123.           }  
  124.           getchar();  
  125.       }  
  126.       for(int i = 1;i < numpoint; ++i){  
  127.          int posx = pp[i].x;  
  128.          int posy = pp[i].y;  
  129.          bfs(posx,posy,i);  
  130.       }  
  131.       sort(ee,ee+numedge,cmp);  
  132.       int ans = kruskal();  
  133.       printf("%d\n",ans);  
  134.     }  
  135.     return 0 ;  
  136. }  
版权声明:本文为博主http://www.feixueteam.net原创文章,未经博主允许不得转载。

POJ3026-Borg Maze

转载请注明出处:優YoU   http://user.qzone.qq.com/289065406/blog/1299324104   提示:BFS+Prim 大致题意: 在一个y行 x列...
  • lyy289065406
  • lyy289065406
  • 2011年07月30日 09:20
  • 5953

POJ-3026 Borg Maze (BFS+最小生成树)

题目链接:点击打开链接 题意: 给你一个地图,地图中A代表外星人,S代表出发点,从S点出发,每遇到一个A点便可分裂成多个。 求把所有A都吃完需要多少步。 刚开始没读好题,我以为S点随时...
  • JOKER_SAMA
  • JOKER_SAMA
  • 2016年08月13日 14:59
  • 306

POJ3026-Borg Maze(广度优先搜索+最小生成树)

Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12346   Acc...
  • AC_road
  • AC_road
  • 2016年07月18日 20:53
  • 706

POJ 3026 Borg Maze(BFS+最小生成树【有坑】)

Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12012 Accepted: 3...
  • qq_32866009
  • qq_32866009
  • 2016年05月09日 16:31
  • 946

poj 3026 Borg Maze bfs+最小生成树

题意:在N*M的迷宫上,从S点出发找一条最短的路径走遍所有的A,且在S和A处可以分成多组同时走,可以分叉,这样就先求出所有点两两之间的距离,找到一棵最小生成树,树上所有边的和就是要求的最小值。...
  • u014422052
  • u014422052
  • 2014年10月18日 12:32
  • 957

poj3026 - Borg Maze

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                               ...
  • wangjian8006
  • wangjian8006
  • 2012年08月20日 12:22
  • 1556

POJ 3026 Borg Maze bfs + 最小生成树

来源:http://poj.org/problem?id=3026 题意:说有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走。从起点‘S’出发。在起点和A处可以分叉,问...
  • wmn_wmn
  • wmn_wmn
  • 2012年08月19日 14:47
  • 1285

poj 3026 Borg Maze (bfs + 最小生成树)

题意:y行x列的迷宫中,#代表阻隔墙(不可走),空格代表空位(可走),S代表搜索起点(可走) A代表外星人站(可走),现在要从S出发,每次可上下左右移动一格到可走的地方,求到达所有的A ...
  • acm_code
  • acm_code
  • 2014年07月20日 20:56
  • 1000

POJ 3026 —— Borg Maze BFS + 最小生成树

Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9071 Ac...
  • u013014691
  • u013014691
  • 2015年01月26日 20:07
  • 384

POJ ~ 3026 ~ Borg Maze (BFS预处理 + 最小生成树)

题意:在一个M行N列的迷宫中(看下样例别弄反了),‘#’表示墙不可以走,其他都可以走,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母A,输出这条路径L的总长度。 AC是AC了,...
  • ZscDst
  • ZscDst
  • 2018年01月24日 18:38
  • 62
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3026 Borg Maze bfs + 最小生成树
举报原因:
原因补充:

(最多只允许输入30个字)