poj 3026 Borg Maze

BFS+prim

在prim之前很暴力地求出各点之间距离。

要注意只有在A和S处可以分开,题目有描述。

读取x和y后要用gets读取换行符。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAXD 51
#define INF 0x3f3f3f3f
using namespace std;
int N,graph[MAXD][MAXD],dis[MAXD][MAXD],a[MAXD*2][2],x,y,cost[MAXD*2][MAXD*2],e;
char data[MAXD][MAXD];

int dir[][2]={{-1,0},{0,1},{1,0},{0,-1}};
void BFS(int src_x,int src_y)
{
    memset(dis,0x3f,sizeof(dis));
    dis[src_x][src_y]=0;
    bool vis[MAXD][MAXD];
    memset(vis,0,sizeof(vis));
    vis[src_x][src_y]=true;
    queue<int> que;
    que.push(x*src_x+src_y);
    int cur,cur_x,cur_y,next,next_x,next_y,i;
    while(!que.empty())
    {
        cur=que.front();
        cur_x=cur/x;
        cur_y=cur%x;
        que.pop();
        for(i=0;i<4;i++)
        {
            next_x=cur_x+dir[i][0];
            next_y=cur_y+dir[i][1];
            next=next_x*x+next_y;
            if(next_x<0||next_x>=y||next_y<0||next_y>=x)
            continue;
            if(!graph[next_x][next_y]&&!vis[next_x][next_y])
            {
               vis[next_x][next_y]=true;
               dis[next_x][next_y]=dis[cur_x][cur_y]+1;
               que.push(next);
            }
        }
    }
}

void getcost(int cur)
{
    int i;
    for(i=0;i<=e;i++)
    {
        if(cur==i)
        continue;
        cost[cur][i]=dis[a[i][0]][a[i][1]];
    }
}

int MST_PRIM()
{
    int key[MAXD*2];
    memset(key,0x3f,sizeof(key));
    key[0]=0;
    bool vis[MAXD*2];
    memset(vis,0,sizeof(vis));
    vis[0]=true;
    int i,j;
    for(i=0;i<=e;i++)
    key[i]=cost[0][i];
    int flag,p,res=0;
    for(i=1;i<=e;i++)
    {
        flag=INF,p=-1;
        for(j=0;j<=e;j++)
        {
            if(!vis[j]&&flag>key[j])
            {
                flag=key[j];
                p=j;
            }
        }
        vis[p]=true;
        res+=flag;
        for(j=0;j<=e;j++)
        {
            if(!vis[j]&&key[j]>cost[p][j])
            key[j]=cost[p][j];
        }
    }
    return res;
}
int main()
{
    //freopen("test.txt","r",stdin);
    scanf("%d",&N);
    int t=N;
    while(t--)
    {
        int i,j;
        cin >> x >> y;
        char temp[MAXD];
        gets(temp); //需要用gets吃掉cin留下来的换行符
        e=0;
        memset(graph,0,sizeof(graph));
        for(i=0;i<y;i++)
        {
            gets(data[i]);
            for(j=0;j<x;j++)
            {
                if(data[i][j]=='#')
                graph[i][j]=1;
                if(data[i][j]=='S')
                {
                    a[0][0]=i;
                    a[0][1]=j;
                }
                if(data[i][j]=='A')
                {
                    e++;
                    a[e][0]=i;
                    a[e][1]=j;
                }
            }
        }
        memset(cost,0,sizeof(cost));
        for(i=0;i<=e;i++)
        {
            BFS(a[i][0],a[i][1]);
            getcost(i);
        }
        printf("%d\n",MST_PRIM());
    }
    return 0;
}

 

posted @ 2013-01-22 18:36  longlongago  Views(160)  Comments(0Edit  收藏  举报