POJ-3026-Borg Maze(Prim+BFS)

鏈接:http://poj.org/problem?id=3026


水題,注意數組大小,測試數據有點坑。


#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cmath>
#include <string>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 2600
#define MAXM 3000
int dis[MAXN][MAXN];
int n,m;
char str[MAXN][MAXN];
bool vis[MAXM];
int low[MAXM];
int D[4][2]= { {1,0},{0,1},{-1,0},{0,-1} };
int prim()
{
    memset(vis,0,sizeof(vis));
    vis[0]=1;
    int ans=0;
    for(int i=1; i<n; ++i)
        low[i]=dis[0][i];
    for(int i=1; i<n; ++i)
    {
        int Min=INF,poi;
        for(int j=1; j<n; ++j)
        {
            if(!vis[j] && low[j]<Min)
            {
                Min=low[j];
                poi=j;
            }
        }
        ans+=low[poi];
        vis[poi]=1;
        for(int j=1; j<n; ++j)
        {
            if(!vis[j] && low[j]>dis[poi][j])
                low[j]=dis[poi][j];
        }
    }
    return ans;
}
int pin[59][59];
int fin[59][59];
int visit[59][59];
struct node
{
    int x,y;
    int cost;
};
int cnt,px[MAXM],py[MAXM];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        scanf("%d%d\n",&m,&n);
        cnt=0;
        for(int i=0; i<n; ++i)
        {
            gets(str[i]);
            for(int j=0; j<m; ++j)
            {
                if(str[i][j]=='A'||str[i][j]=='S')
                {
                    px[cnt]=i;
                    py[cnt]=j;
                    pin[i][j]=cnt++;
                }
            }
        }
        for(int i=0; i<n; ++i)
            for(int j=0; j<m; ++j)
                if(str[i][j]=='A'||str[i][j]=='S')
                {
                    memset(visit,0,sizeof(visit));
                    queue<node> q;
                    while(!q.empty())q.pop();
                    node ni;
                    ni.x=i,ni.y=j;
                    ni.cost=0;
                    q.push(ni);
                    visit[i][j]=1;
                    while(!q.empty())
                    {
                        node ip=q.front();
                        q.pop();
                        for(int k=0; k<4; ++k)
                        {
                            int xx=ip.x+D[k][0];
                            int yy=ip.y+D[k][1];
                            if(xx<0 || yy<0 ||xx>=n ||yy>=m)continue;
                            if(!visit[xx][yy] && str[xx][yy]!='#')
                            {
                                visit[xx][yy]=1;
                                node ne;
                                ne.x=xx;
                                ne.y=yy;
                                ne.cost=ip.cost+1;
                                q.push(ne);
                                if(str[xx][yy]=='A'||str[xx][yy]=='S')
                                    dis[ pin[i][j] ][ pin[xx][yy] ]=ne.cost;
                            }
                        }
                    }
                }
        n=cnt;
        printf("%d\n",prim());
    }
    return 0;
}

/*
1
50 50
##################################################
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#
#                                               A#
#                                               A#
#                                               A#
#S                                              A#
##################################################
*/


發佈了397 篇原創文章 · 獲贊 9 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章