您的位置:首页 > 其它

POJ 3026 Borg Maze(bfs+prim)

2012-12-08 11:19 246 查看
题目链接

题意也是挺难懂的。把所有的A,S看成一个点,求这些点的最小生成树。先BFS预处理出来然后prim,注意m,n后边的空格问题,然后数组开小了,也错了次。

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
int p[1001][1001],low[1001];
char str[101][101];
int o[301][301],key[301][301],n,m,kk[1001];
int a[4] = {0,0,1,-1};
int b[4] = {1,-1,0,0};
int quer[20000],quec[20000];
void bfs(int num,int x,int y)
{
int st,end,i,j,step,k;
st = end = 1;
for(i = 0;i < n;i ++)
{
for(j = 0;j < m;j ++)
{
if(str[i][j] == '#')
key[i][j] = 1;
else
key[i][j] = 0;
}
}
quer[1] = x;
quec[1] = y;
p[num][num] = 0;
key[x][y] = 1;
step = 1;
while(st <= end)
{
j = 1;
for(i = st;i <= end;i ++)
{
for(k = 0;k <= 3;k ++)
{
int r,c;
r = quer[i]+a[k];
c = quec[i]+b[k];
if(r >= 0&&r < n&&c >= 0&&c < m&&!key[r][c])
{
key[r][c] = 1;
if(str[r][c] == 'A'||str[r][c] == 'S')
p[num][o[r][c]] = step;
quer[end+j] = r;
quec[end+j] = c;
j ++;
}
}
}
step ++;
st = end+1;
end = end+j-1;
}
return ;
}
int main()
{
int t,i,j,num,ans,mi,z;
char ch[101];
scanf("%d",&t);
while(t--)
{
memset(o,0,sizeof(o));
memset(key,0,sizeof(key));
memset(kk,0,sizeof(kk));
scanf("%d%d",&m,&n);
gets(ch);
for(i = 0;i < n;i ++)
{
gets(str[i]);
}
num = 1;
for(i = 0;i < n;i ++)
{
for(j = 0;j < m;j ++)
{
if(str[i][j] == 'S'||str[i][j] == 'A')
o[i][j] = num++;
else
key[i][j] = 1;
}
}
num --;
for(i = 0;i < n;i ++)
{
for(j = 0;j < m;j ++)
{
bfs(o[i][j],i,j);
}
}
ans = 0;
for(i = 1;i <= num;i ++)
low[i] = p[1][i];
kk[1] = 1;
for(i = 1;i <= num-1;i ++)
{
mi = 100000;
for(j = 1;j <= num;j ++)
{
if(mi > low[j]&&!kk[j])
{
mi = low[j];
z = j;
}
}
kk[z] = 1;
ans += mi;
for(j = 1;j <= num;j ++)
{
if(low[j] > p[z][j]&&!kk[j])
low[j] = p[z][j];
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: