Borg Maze poj 3026
2016-11-26 14:59
337 查看
传送门:poj3026
这题重点其实考的是图的抽象和转化的能力,bfs把输入的二维矩阵扫一遍,得到每两个标记点之间的最短距离,然后这题实际上就变成了求最小生成树。。
bfs的时候还是要有点小技巧的,暴力两两扫的话会T。
这题重点其实考的是图的抽象和转化的能力,bfs把输入的二维矩阵扫一遍,得到每两个标记点之间的最短距离,然后这题实际上就变成了求最小生成树。。
bfs的时候还是要有点小技巧的,暴力两两扫的话会T。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; char map[55][55]; int n,m; int go[4][2]={1,0,0,1,-1,0,0,-1}; int f[2500]; struct node//用于记录任意两个标记点之间最短距离 { int u,v,w; }q[100000]; struct node1{ int r,c; int step; }p[2500]; int tmp[55][55];//该数组用于记录bfs的起始点到图中任意点的最短距离 bool cmp(node a,node b) { return a.w<b.w; } int getf(int k) { return k==f[k]?k:f[k]=getf(f[k]); } int bfs(int s) { int book[55][55]; memset(book,0,sizeof(book)); memset(tmp,0,sizeof(tmp)); queue<node1> que; que.push(node1{p[s].r,p[s].c,0}); while(!que.empty()) { node1 t=que.front(),a; que.pop(); for(int i=0;i<4;i++) { a=t; a.r+=go[i][0]; a.c+=go[i][1]; a.step++; if(!book[a.r][a.c]&&0<=a.r&&a.r<m&&0<=a.c&&a.c<n&&map[a.r][a.c]!='#') { book[a.r][a.c]=1; tmp[a.r][a.c]=a.step; que.push(a); } } } } int main() { int t; char c; scanf("%d",&t); while(t--) { memset(q,0,sizeof(q)); memset(p,0,sizeof(p)); memset(map,0,sizeof(map)); int cnt=1; scanf("%d%d",&n,&m); c=getchar(); while(c!='\n')c=getchar(); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='A'||map[i][j]=='S')//给每个标记点标号 { p[cnt].r=i; p[cnt++].c=j; } } getchar(); } int t=0,k=0; for(int x=1;x<cnt;x++) { k=0; bfs(x); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(map[i][j]=='A'||map[i][j]=='S')//将标号为x的标记点到任意标记点的最短距离记录下来 { k++; if(k!=x) { q[t].u=x; q[t].v=k; q[t++].w=tmp[i][j]; } } } } } sort(q,q+t,cmp); for(int i=0;i<=cnt;i++) f[i]=i; int count=1,i=0,ans=0; while(count<cnt-1)//kruskal { if(getf(q[i].u)!=getf(q[i].v)) { f[getf(q[i].u)]=getf(q[i].v); count++; ans+=q[i].w; //printf("%d %d %d\n",q[i].u,q[i].v,q[i].w); } i++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- Borg Maze poj 3026
- Poj 3026 Borg Maze
- POJ 3026 Borg Maze(bfs+最小生成树)
- POJ 3026 Borg Maze(bfs+最小生成树-Prim)
- POJ 3026 Borg Maze bfs + 最小生成树
- POJ 3026 Borg Maze BFS+最小生成树
- POJ3026——Borg Maze(BFS+最小生成树)
- POJ 3026 Borg Maze //qdu_cxsys_最小生成树
- POJ 3026 Borg Maze(BFS + 最小生成树)
- POJ 3026 Borg Maze(kuangbin带你飞 专题六:最小生成树,完结)
- poj 3026( Borg Maze BFS + Prim)
- POJ-3026 Borg Maze BFS+最小生成树
- 【POJ 3026】Borg Maze
- POJ-3026--Borg&nbsp;Maze
- POJ 3026 Borg Maze
- poj3026——Borg Maze(BFS+最小生成树)
- POJ 3026, Borg Maze
- poj 3026 Borg Maze(最小生成树)
- poj 3026 Borg Maze
- POJ 3026 Borg Maze BFS+MST