题解 POJ3026 Borg Maze(博格迷宫)

题目link
其实这道题思路好想个鬼,题意难懂
BFS求出各点距离,跑Kruskal即可

#include<algorithm>//STL通用算法
#include<bitset>//STL位集容器
#include<cctype>//C字符处理
#include<cerrno>//C的错误报告机制
#include<clocale>
#include<cmath>//兼容C语言数学库
#include<cstdio>//C语言输入输出工具
#include<cstdlib>//C语言通用工具
#include<cstring>//C字符串
#include<ctime>
#include<deque>//STL双端队列容器
#include<exception>//异常处理类
#include<fstream>//文件输入输出流
#include<functional>//STL定义运算函数(代替运算符)
#include<limits>
#include<list>//STL线性列表容器
#include<map>//STL映射容器
#include<iomanip>
#include<ios>//基本输入/输出支持
#include<iosfwd>//输入/输出系统使用的前置声明
#include<iostream>//基本输入输出流
#include<queue>//STL队列容器
#include<set>//STL集合容器
#include<sstream>//基于字符串的流
#include<stack>//STL堆栈容器
#include<stdexcept>//标准异常类
#include<streambuf>//底层输入/输出支持
#include<string>//字符串类
#include<utility>//STL通用模板类
#include<vector>//STL动态数组容器
#include<cwchar>
#include<cwctype>
using namespace std;
int T,m,n,cnt,vis[51][51],P[51][51],ecnt,ans,fa[1000010];
int inf=2100000000;
int Tow[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
char jz[51][51];
struct node
{
	int x,y,step;
};
struct edge
{
	int s,e,d;
}E[1000010];
void BFS(int p,int x,int y)
{
	memset(vis,0,sizeof(vis));
	queue<node>Q;
	node BEGIN;
	BEGIN.x=x;
	BEGIN.y=y;
	BEGIN.step=0;
	Q.push(BEGIN);
	vis[x][y]=1;
	while(!Q.empty())
	{
		node now=Q.front();
		Q.pop();
		if(jz[now.x][now.y]>='A'&&jz[now.x][now.y]<='Z')
		{
			E[++ecnt].s=p;
			E[ecnt].e=P[now.x][now.y];
			E[ecnt].d=now.step;
			E[++ecnt].s=P[now.x][now.y];
			E[ecnt].e=p;
			E[ecnt].d=now.step;
		}
		for(int i=0;i<4;i++)
        {
        	node next;
            next.x=now.x+Tow[i][0];
            next.y=now.y+Tow[i][1];
            if(next.x>0&&next.x<=m&&next.y>0&&next.y<=n&&jz[next.x][next.y]!='#'&&!vis[next.x][next.y])
            {
                vis[next.x][next.y]=1;
                next.step=now.step+1;
                Q.push(next);
            }
        }
	}
}
int cmp(edge a,edge b)
{
	return a.d<b.d;
}
int find(int x)
{
	if(fa[x]==x)
	{
		return x;
	}
	return fa[x]=find(fa[x]);
}
void Kruskal()
{
	int total=0;
	sort(E+1,E+ecnt+1,cmp);
	for(int i=1;i<=ecnt;i++)
	{
		int u=find(E[i].s),v=find(E[i].e);
		if(u!=v)
		{
			fa[u]=v;
			ans+=E[i].d;
			total++;
			if(total==cnt-1)
			{
				cout<<ans<<endl;
				return;
			} 
		}
	}
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		cnt=0;
		ans=0;
		ecnt=0;
		scanf("%d%d\n",&m,&n);
		for(int i=1;i<=n;i++)
		{
			gets(jz[i]+1);
			for(int j=1;j<=m;j++)
			{
				if(jz[i][j]>='A'&&jz[i][j]<='Z')
				{
					P[i][j]=++cnt;
					fa[cnt]=cnt;
				}
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(jz[i][j]>='A'&&jz[i][j]<='Z')
				{
					BFS(P[i][j],i,j);
				}
			}
		}
		Kruskal();
	}
}   
posted @ 2019-06-06 15:25  G_A_TS  阅读(452)  评论(0编辑  收藏  举报