您的位置:首页 > 其它

POJ 3026 Borg Maze

2010-10-21 20:13 288 查看
一个迷宫中有若干个外星人,现在一批人从起点出发去抓他们,在起点或每次抓到一个人后,可以选择分成若干拨分头去抓,求抓完所有外星人时,每拨人走的路径和的最小值,即求使每个点(起点和外星人所在点)连通的最短路径

代码:

#include<iostream>
#include<queue>
using namespace std;
#define MAX 105
#define inf 0x3f3f3f3f
struct node
{
int x;
int y;
int step;
}m[MAX];
int dis[MAX];
int u[MAX][MAX],map[MAX][MAX];
int g[MAX][MAX];
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int l,r,cnt;
void bfs(struct node s,int k)
{
struct node a,b;
int i,num=cnt-1;
memset(u,0,sizeof(u));
u[s.x][s.y]=1;
queue<node>q;
s.step=0;
q.push(s);
while(!q.empty())
{
a=q.front();
q.pop();
for(i=0;i<4;i++)
{
b.x=a.x+dir[i][0];
b.y=a.y+dir[i][1];
if(!u[b.x][b.y]&&map[b.x][b.y]>=0)
{
b.step=a.step+1;
u[b.x][b.y]=1;
if(map[b.x][b.y]>0)
{
g[k][map[b.x][b.y]]=g[map[b.x][b.y]][k]=b.step;
num--;
if(num==0)
return;
}
q.push(b);
}
}
}
}
int min(int a,int b)
{
return a<b?a:b;
}
int prim()
{
int i,j,ans,min_w,min_node,now;
for(i=1;i<=cnt;i++)
dis[i]=inf;
now=1;
ans=0;
for(i=1;i<cnt;i++)
{
min_w=inf;
dis[now]=-1;
for(j=1;j<=cnt;j++)
{
if(j!=now&&dis[j]>=0)
{
dis[j]=min(dis[j],g[now][j]);
if(dis[j]<min_w)
{
min_w=dis[j];
min_node=j;
}
}
}
ans+=min_w;
now=min_node;
}
return ans;
}
int main()
{
int i,j,test,ans;
char c,str[MAX];
scanf("%d",&test);
while(test--)
{
scanf("%d %d",&l,&r);
gets(str);//读掉l,r后面的空格
memset(map,0,sizeof(map));
memset(m,0,sizeof(m));
memset(g,0,sizeof(g));
cnt=0;
for(i=1;i<=r;i++)
{
for(j=1;j<=l;j++)
{
scanf("%c",&c);
if(c=='#')
{
map[i][j]=-1;
}
else if(c=='S'||c=='A')
{
cnt++;
map[i][j]=cnt;
m[cnt].x=i;
m[cnt].y=j;
}
else
map[i][j]=0;
}
getchar();
}
for(i=1;i<=cnt;i++)
{
bfs(m[i],i);
}
ans=0;
ans=prim();
printf("%d/n",ans);
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: