POJ3026Borg Maze(BFS+prim最小生成树)

来源:互联网 发布:戈博贝尔求生刀淘宝 编辑:程序博客网 时间:2024/05/18 10:15

原题地址:点击打开链接

#include<stdio.h>#include<queue>#include<string.h>#define MAX 1<<31-1using namespace std;struct Point{int x;int y;};int d[110][110];char map[55][55];int numOfMap[55][55];int vis[55][55];int time[55][55];int x[4]={-1,0,1,0},y[4]={0,1,0,-1};int dist[110];int used[110];int num;int m,n;void bfs(Point p){int i,a,b;memset(vis,0,sizeof(vis));memset(time,0,sizeof(time));queue<Point>que;que.push(p);vis[p.x][p.y]=1;while(!que.empty()){Point p1=que.front();que.pop();for(i=0;i<4;i++){a=p1.x+x[i];b=p1.y+y[i];if(a>=0&&a<=m&&b>=0&&b<=n&&vis[a][b]!=1&&map[a][b]!='#'){time[a][b]=time[p1.x][p1.y]+1;vis[a][b]=1;que.push((Point){a,b});if(numOfMap[a][b]>0){d[numOfMap[p.x][p.y]][numOfMap[a][b]]=time[a][b];}}}}}int prim(){int i,j,min,u,res=0;memset(used,0,sizeof(used));for(i=1;i<=num;i++)dist[i]=MAX;dist[1]=0;for(i=1;i<=num;i++){min=MAX;for(j=1;j<=num;j++){if(!used[j]&&min>dist[j]){min=dist[j];u=j;}}used[u]=1;for(j=1;j<=num;j++){if(used[j]!=1&&dist[j]>d[u][j])dist[j]=d[u][j];}}for(i=1;i<=num;i++)res+=dist[i];return res;}int main(){int i,j,t;char str[110];scanf("%d",&t);while(t--){num=0;memset(numOfMap,0,sizeof(numOfMap));memset(d,0,sizeof(d));scanf("%d%d",&n,&m);gets(str);for(i=0;i<m;i++)gets(map[i]);for(i=0;i<m;i++)for(j=0;j<n;j++){if(map[i][j]=='A'||map[i][j]=='S'){numOfMap[i][j]=++num;}}for(i=1;i<=num;i++)for(j=1;j<=num;j++)d[i][j]=MAX;for(i=0;i<m;i++)for(j=0;j<n;j++){if(numOfMap[i][j]>0){bfs((Point){i,j});}}int res=prim();printf("%d\n",res);}return 0;} /*36 5##### #A#A### # A##S  ####### 7 7#####  #AAA####    A## S ####     ##AAA########  7 7#####  #AA#A###    A## S ####     ##AAA########  */


1 0
原创粉丝点击