标签:des blog io ar os sp for strong div
Borg Maze
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8905 | Accepted: 2969 |
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
#include<cstdio> #include <cstring> #include <queue> #include <assert.h> using namespace std; char maz[202][202]; bool vis[202][202]; int d[201][202][202]; int alien[201][2]; int numa; int x,y; int sx,sy; int e[202][202]; typedef pair<int,int> P; queue<P> que; const int dx[4]={0,0,-1,1}; const int dy[4]={-1,1,0,0}; bool used[101]; void bfs(){ sx=sy=-1; numa=0; memset(vis,0,sizeof(vis)); for(int i=0;i<y;i++){ for(int j=0;j<x;j++){ if(maz[i][j]==‘S‘){ sx=j; sy=i; break; } } } assert(sx!=-1&&sy!=-1); vis[sy][sx]=true; d[0][sy][sx]=0; alien[numa][0]=sy; alien[numa++][1]=sx; que.push(P(sy,sx)); while(!que.empty()){ P p=que.front(); que.pop(); for(int i=0;i<4;i++){ int ny=p.first+dy[i]; int nx=p.second+dx[i]; if(nx>=0&&nx<x&&ny>=0&&ny<y&&!vis[ny][nx]&&maz[ny][nx]!=‘#‘){ d[0][ny][nx]=d[0][p.first][p.second]+1; vis[ny][nx]=true; que.push(P(ny,nx)); if(maz[ny][nx]==‘A‘){ alien[numa][0]=ny; alien[numa++][1]=nx; } } } } for(int ai=1;ai<numa;ai++){ memset(vis,0,sizeof(vis)); int ay=alien[ai][0],ax=alien[ai][1]; d[ai][ay][ax]=0; que.push(P(ay,ax)); vis[ay][ax]=true; while(!que.empty()){ P p=que.front(); que.pop(); for(int i=0;i<4;i++){ int ny=p.first+dy[i]; int nx=p.second+dx[i]; if(nx>=0&&nx<x&&ny>=0&&ny<y&&!vis[ny][nx]&&maz[ny][nx]!=‘#‘){ d[ai][ny][nx]=d[ai][p.first][p.second]+1; vis[ny][nx]=true; que.push(P(ny,nx)); } } } } for(int i=0;i<numa;i++){ //int ay=alien[i][0],ax=alien[i][1]; for(int j=0;j<numa;j++){ int ay1=alien[j][0],ax1=alien[j][1]; e[i][j]=d[i][ay1][ax1]; } } } priority_queue <P,vector<P>, greater <P> > pque; int prim(){ memset(used,0,sizeof(used)); used[0]=true; int unum=1; for(int i=1;i<numa;i++){ pque.push(P(e[0][i],i)); } int ans=0; while(unum<numa){ int t=pque.top().second; int td=pque.top().first; pque.pop(); if(used[t])continue; ans+=td; used[t]=true; unum++; for(int i=0;i<numa;i++){ if(!used[i]){ pque.push(P(e[t][i],i)); } } } while(!pque.empty())pque.pop(); return ans; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&x,&y); gets(maz[0]); for(int i=0;i<y;i++){ gets(maz[i]); } bfs(); int ans=prim(); printf("%d\n",ans); } }
poj 3026 Borg Maze 最小生成树+bfs prim算法
标签:des blog io ar os sp for strong div
原文地址:http://www.cnblogs.com/xuesu/p/4093932.html