日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【POJ - 3026】Borg Maze(bfs预处理 + 最小生成树,建图)

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【POJ - 3026】Borg Maze(bfs预处理 + 最小生成树,建图) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題干:

The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The Borg collective is the term used to describe the group consciousness of the Borg civilization. Each Borg individual is linked to the collective by a sophisticated subspace network that insures each member is given constant supervision and guidance.?

Your task is to help the Borg (yes, really) by developing a program which helps the Borg to estimate the minimal cost of scanning a maze for the assimilation of aliens hiding in the maze, by moving in north, west, east, and south steps. The tricky thing is that the beginning of the search is conducted by a large group of over 100 individuals. Whenever an alien is assimilated, or at the beginning of the search, the group may split in two or more groups (but their consciousness is still collective.). The cost of searching a maze is definied as the total distance covered by all the groups involved in the search together. That is, if the original group walks five steps, then splits into two groups each walking three steps, the total distance is 11=5+3+3.

Input

On the first line of input there is one integer, N <= 50, giving the number of test cases in the input. Each test case starts with a line containg two integers x, y such that 1 <= x,y <= 50. After this, y lines follow, each which x characters. For each character, a space `` '' stands for an open space, a hash mark ``#'' stands for an obstructing wall, the capital letter ``A'' stand for an alien, and the capital letter ``S'' stands for the start of the search. The perimeter of the maze is always closed, i.e., there is no way to get out from the coordinate of the ``S''. At most 100 aliens are present in the maze, and everyone is reachable.

Output

For every test case, output one line containing the minimal cost of a succesful search of the maze leaving no aliens alive.

Sample Input

2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####

Sample Output

8 11

題目大意:

這個題意是真難懂啊、、、

在一個迷宮中有很多外星人A,某個人在S點開始去抓捕,抓捕到外星人后這個人可以分身為任意個(也可以不分身),求把所有外星人抓完所用的最小距離,距離包括分身走的距離(即所有的距離都算上,比如:兩個分身同時走三步,那么走的距離就是6,而不是3),在迷宮之中只能向東南西北四個方向移動。

換種說法:

給你一個地圖,地圖中A代表外星人,S代表出發點,從S點出發,在起點S 或是 每遇到一個A點 便可不分裂或是分裂成多個。求把所有A都吃完需要多少步。注意不要以為當前點隨時都能分裂,而是只有在S或是遇到A才能分裂。

解題報告:

? 注意這題樣例 n m 和字符串之間可能有一行空行(而不一定是一個空格)真tm格式、、所以getchar會WA的。。

因為不難發現,既然這個題意的話,那么起點在哪并沒有怎么所謂了,因為S的所有特點和A的所有特點是完全相同的,所以可以把S點也看成是一個A點,那么題意轉化成:從一個A點出發,在所有A點相連的路徑中選擇一些路徑,使得走過的路最小。

那么解法很顯然了,假設有tot個S和A,那么用bfs構造出這tot個點之間的距離,然后求個MST就好,因為稠密圖而且是完全圖所以首選prim。

AC代碼:

#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define F first #define S second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 200 + 5; const int INF = 0x3f3f3f3f; int n,m; char s[MAX][MAX]; int bk[MAX][MAX],cost[MAX][MAX],tot; bool vis[MAX][MAX]; int nx[4] = {0,1,0,-1}; int ny[4] = {1,0,-1,0}; struct Node {int x,y,t;Node(int x=0,int y=0,int t=0):x(x),y(y),t(t){} }; void bfs(int stx,int sty) {int id1 = bk[stx][sty];queue<Node> q;q.push(Node(stx,sty,0));memset(vis,0,sizeof vis);vis[stx][sty]=1;while(!q.empty()) {Node cur = q.front();q.pop();int id2 = bk[cur.x][cur.y];if(bk[cur.x][cur.y]) cost[id1][id2] = cur.t;for(int k = 0; k<4; k++) {int tx = cur.x+nx[k];int ty = cur.y+ny[k];if(tx<0||tx>n||ty<1||ty>m) continue;if(vis[tx][ty] || s[tx][ty] == '#') continue;vis[tx][ty] = 1;q.push(Node(tx,ty,cur.t+1));}} } int VIS[MAX*MAX],dis[MAX*MAX]; int prim() {int res = 0;for(int i = 1; i<=tot; i++) dis[i] = INF,VIS[i] = 0;dis[1] = 0;while(1) {int minv,minw=INF;for(int i = 1; i<=tot; i++) {if(VIS[i] == 0 && dis[i] < minw) minw = dis[i],minv = i;}if(minw == INF) break;VIS[minv] = 1;for(int i = 1; i<=tot; i++) {if(VIS[i] == 0 && dis[i] > cost[minv][i]) dis[i] = cost[minv][i];}res += dis[minv];}return res; } int main() {int t;cin>>t;while(t--) {tot=0;memset(bk,0,sizeof bk);memset(cost,0,sizeof cost);scanf("%d%d",&m,&n);string qq;getline(cin,qq);for(int i = 1; i<=n; i++) {cin.getline(s[i]+1,1005);for(int j = 1; j<=m; j++) {if(s[i][j] == 'S' || s[i][j] == 'A') bk[i][j] = ++tot;}}for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++) {if(bk[i][j]) bfs(i,j);}}printf("%d\n",prim());} return 0 ; }

剛開始WA在數組就開了50*50這么大,導致cost數組也開了[50][50],但是其實應該[2501][2501],但是其實這題說了最多100個外星人,所以可以開[105][105]就夠了。

總結

以上是生活随笔為你收集整理的【POJ - 3026】Borg Maze(bfs预处理 + 最小生成树,建图)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧洲金发美女大战黑人 | 香港台湾日本三级大全 | 亚洲国产精品狼友在线观看 | 国产人人干| 日韩免费视频一区 | 久久久一级 | 99热综合 | 曰韩毛片 | 爽爽窝窝午夜精品一区二区 | 久久久久亚洲AV成人网人人小说 | 波多野av在线| 丰满人妻一区二区三区免费视频 | 国外av网站 | 国产精品精品久久久久久 | 欧美成人综合网站 | 高清av在线 | 中国美女黄色 | 自拍偷拍免费 | 亚洲videos | 亚洲精品久久久久中文字幕二区 | 色婷婷婷婷| 中国浓毛少妇毛茸茸 | xxxx视频在线| 国产一区二区三区在线免费观看 | 国产高清一区在线 | 国产第99页 | 亚洲激情三区 | 在线人成| 国产视频一二 | 福利资源在线 | 日韩欧美一级大片 | 五十路在线观看 | 日本一区二区久久 | 蜜乳av网站 | 亚洲熟女乱色一区二区三区 | 中国黄色大片 | 国产成人无遮挡在线视频 | 在线国产三级 | 午夜国产福利在线观看 | 黄三级 | 亚洲AV无码一区二区三区少妇 | 亚洲黄色片在线观看 | 日本人极品人妖高潮 | 污的网站 | 成人亚洲玉足脚交系列 | 大度亲吻原声视频在线观看 | 在线免费观看成人 | 成人精品一区日本无码网 | www视频在线观看免费 | 欧美成人h版| 亚洲永久精品视频 | 午夜簧片| 午夜看片网站 | 韩国女同性做爰三级 | 亚洲综合伊人 | 国产v亚洲 | 51吃瓜网今日 | 久久久久国产精品午夜一区 | 依依成人在线视频 | 国产h自拍 | 激情av中文字幕 | 麻豆最新| 欧美bbw视频 | 日本人xxxⅹ18hd19hd | 女尊高h男高潮呻吟 | 女人裸体又黄 | 干美女av| 欧美一级免费 | 国产亚洲久久 | 欧美成本人视频 | 青青操视频在线播放 | 国产专区欧美专区 | 久久精品国产99久久久 | 国产噜噜噜 | 999这里只有精品 | av大全在线观看 | 尤物在线免费观看 | 成人免费国产 | 国产激情图片 | 蜜桃aaa | av作品在线观看 | 国产伦精品一区二区三区在线观看 | 私密spa按摩按到高潮 | 高清av一区二区三区 | 意大利少妇愉情理伦片 | 在线观看成人免费 | 在线精品一区二区三区 | 丝袜脚交免费网站xx | 奇米影视亚洲春色 | 在线色网址 | 日本色一区| 免费人成在线观看网站 | 亚洲一区在线观 | 成人做爰免费视频免费看 | 欧洲女性下面有没有毛发 | 97超碰碰 | 依依成人在线视频 | www.色播.com | 让男按摩师摸好爽 |