POJ 3206 Borg Maze(bfs+prim)
来源:互联网 发布:淘宝直通车图片优化 编辑:程序博客网 时间:2024/05/17 22:32
题意:
每次从S点出发,可以一变二,分开走。问最少经过多少步可以遍历完所有的A点
思路:
之前做过一道bfs+dfs的题,
bfs+dfs- poj2688-Cleaning Robot。
这道题也是一样。一眼看上去就感觉单纯搜索解,一定是无法解决的,因为会有往返,因此就先用bfs进行预处理,造成一个稠密图也就是最小到达点的步骤,然后基于此图构造最小生成树
注意:WA了n多发,无奈去查,发现数据太坑 比如6 5 后面会有很多空格!!
#include <iostream>#include <queue>#include <cstring>#include <algorithm>#include <stdio.h>using namespace std;char mp[555][555];int dis[555][555];int vis[555][555];int tag[555][555];const int inf =0x3f3f3f3f;struct node{ int x,y,step; bool friend operator <(node a,node b) { return a.step>b.step; }}point[505];int w,h,cnt,ans;void bfs(node fir,int pt){ queue <node > s; fir.step=0; while(!s.empty()) s.pop(); vis[fir.x][fir.y]=1; s.push(fir); while(!s.empty()) { node t=s.front(); s.pop(); if(mp[t.x][t.y ]=='A'||mp[t.x][t.y]=='S') dis[ pt][ tag[t.x][t.y] ]=t.step; int next[4][2 ]={ 0,1,0,-1,1,0,-1,0}; for(int i=0;i<4;i++) { node temp=t; temp.x+=next[i][0]; temp.y+=next[i][1]; if(temp.x<1||temp.y<1||temp.x>h||temp.y>w||vis[temp.x][temp.y]==1||mp[temp.x][temp.y]=='#') { continue; } temp.step+=1; s.push(temp); vis[temp.x][temp.y]=1; } }}int dist[505];int vist[505];void prim(int cur){ int sum=0; for(int i=0;i<=cnt;i++) { dist[i]=dis[cur][i]; } vist[cur]=1; for(int i=1;i<=cnt;i++) { int index=-1; int minn=inf; for(int j=1;j<=cnt;j++) { if(vist[j]==0&&dist[j]<=minn) { minn=dist[j]; index=j; } } vist[index]=1; sum+=minn; for(int j=1;j<=cnt;j++) { if(vist[j]==0) { if(dist[j]>=dis[index][j]) { dist[j]=dis[index][j]; } } } } cout<<sum<<endl;}int main(){ int T; cin>>T; while(T--) { scanf("%d%d",&w,&h); { cnt=0; char ff=getchar(); while(ff==' ' ) { ff=getchar(); } memset(mp,0,sizeof(mp)); memset(point,0,sizeof(point)); memset(tag,0,sizeof(tag)); memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(vist,0,sizeof(vist)); memset(dist,0,sizeof(dist)); for(int i=1;i<=h;i++) { for(int j=1;j<=w;j++) { char pg=getchar(); mp[i][j]=pg; // scanf("%c",&mp[i][j]); if(mp[i][j]=='A') { point[++cnt].x=i; point[cnt].y=j; tag[i][j]=cnt; } else if(mp[i][j]=='S') { tag[i][j]=0; point[0].x=i; point[0].y=j; } } getchar(); } for(int i=0;i<=cnt;i++) { for(int j=0;j<=cnt;j++) { if(i!=j) dis[i][j]=inf; else dis[i][j]=0; } } for(int i=0;i<=cnt;i++) { memset(vis,0,sizeof(vis)); bfs( point[i],i ); } memset(vist,0,sizeof(vist)); prim(0); } }}
0 0
- POJ 3206 Borg Maze (BFS+Prim)
- POJ 3206 Borg Maze(bfs+prim)
- POJ 3026 Borg Maze BFS+Prim
- POJ 3026--Borg Maze (BFS+Prim)
- poj 3026 Borg Maze (BFS + Prim)
- poj 3026 Borg Maze (bfs+prim)
- 【BFS+Prim】poj 3026 Borg Maze
- POJ 3026:Borg Maze:BFS+prim
- POJ 3026 Borg Maze (BFS+Prim)
- POJ 3026 Borg Maze(BFS+Prim)
- poj 3026 Borg Maze bfs+prim
- POJ 3026 Borg Maze BFS和prim
- POJ 3026 Borg Maze(BFS+prim)
- poj-3026 -Borg Maze -bfs+prim(MST)
- POJ 3026 Borg Maze (prim+bfs)
- poj 3026 Borg Maze(BFS+Prim)
- POJ 3026 Borg Maze (bfs+prim)
- POJ 3026 Borg Maze (bfs+prim)
- Linux添加共享库路径
- iOS App 中,需要绑定微博、Twitter、Flickr 等第三方平台账号时,用 OAuth 授权
- ajax post与get
- sql 查询某一字段包含特定字符的数量
- MessageBox用法大全
- POJ 3206 Borg Maze(bfs+prim)
- 区别call() 和 .apply()
- C# 中闭包问题
- [第三步]homebridge添加yeelight插件支持彩色灯控制以及亮度调节
- 一个数组中两个数的和为N,找出这两个数字的下标
- iOS10 权限崩溃问题
- Socket、Tcp、Udp、Http 的认识及区别
- Kafka设计解析(二)- Kafka High Availability (上)
- 1020. Tree Traversals (25)