题解 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();
}
}