poj 3026 Borg Maze

题目链接http://poj.org/problem?id=3026

题意:从S到所有A的最小生成树

错误点分析:题意理解;读入n,m的时候后面有很多空格;BFS+最小生成树

分类:BFS+最小生成树

代码

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<queue>
#define MAX 0x3f3f3f3f
#include<iostream>

using namespace std;
int n,m;
int len;
int ans;
struct
{
    int x,y;
}A[305];
char s[300][300];
int vis[300][300];
int map[305][305];

int dir[4][2]={1,0,0,1,-1,0,0,-1};

struct P
{
    int x,y,step;
};

queue <P> que;

void BFS(int ii,int jj)
{
    int i,j;
    int cur;
    for(i=1;i<=len;i++)
    {
        if(A[i].x==ii&&A[i].y==jj)
        {
            cur=i;
            break;
        }
    }
    P p;
    p.x=ii;
    p.y=jj;
    p.step=0;
    que.push(p);

    while(!que.empty())
    {
        P p=que.front();
        vis[ii][jj]=1;
        for(i=0;i<4;i++)
        {
            int tempx,tempy;
            tempx=p.x+dir[i][0];
            tempy=p.y+dir[i][1];
            if(tempx>=0&&tempx<n&&tempy>=0&&tempy<m&&!vis[tempx][tempy]&&s[tempx][tempy]!='#')
            {
                P tmp;
                tmp.x=tempx;
                tmp.y=tempy;
                tmp.step=p.step+1;
                vis[tempx][tempy]=1;
                if(isalpha(s[tempx][tempy]))
                {
                     int curr;
                     for(j=1;j<=len;j++)
                     {
                         if(A[j].x==tempx&&A[j].y==tempy)
                         {
                             curr=j;
                             break;
                         }
                     }
                     map[cur][curr]=tmp.step;
                }
                que.push(tmp);
            }
        }
        que.pop();
    }
}

int prime()
{
    int i,j,pos,Min;
    int vi[len+5],low[len+5];
    memset(vi,0,sizeof(vi));
    vi[1]=1;
    pos=1;

    for(i=1;i<=len;i++)
    {
        if(i!=pos)
        low[i]=map[pos][i];
    }

    for(i=1;i<len;i++)
    {
        Min=MAX;
        for(j=1;j<=len;j++)
        {
            if(!vi[j]&&Min>low[j])
            {
                pos=j;
                Min=low[j];
            }
        }
        ans+=Min;
        vi[pos]=1;
        for(j=1;j<=len;j++)
        {
            if(!vi[j]&&low[j]>map[pos][j])
            {
                low[j]=map[pos][j];
            }
        }
    }
    return ans;
}

int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        ans=len=0;
        char ss[300];
        gets(ss);
        getchar();
        int haha = 0;
        n = m = 0;
        for(int i=0;i<strlen(ss);i++)
        {
            if(isdigit(ss[i]))
            {
                if(!haha)
                {
                    m = m * 10 + ss[i] - '0';
                }
                else
                {
                    n = n * 10 + ss[i] - '0';
                }
            }
            else
                haha = 1;
        }
        int i,j;
        for(i=0;i<n;i++)
        {
            gets(s[i]);
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(isalpha(s[i][j]))
                {
                    ++len;
                    A[len].x=i;
                    A[len].y=j;
                }
            }
        }

        for(i=1;i<=len;i++)
        {
            for(j=1;j<=len;j++)
            {
               map[i][j]=MAX;
            }
        }

        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(isalpha(s[i][j]))
                {
                     memset(vis,0,sizeof(vis));
                     BFS(i,j);
                }
            }
        }
        printf("%d
",prime());
    }
    return 0;
}
anytime you feel the pain.hey,refrain.don't carry the world upon your shoulders
原文地址:https://www.cnblogs.com/gaoss/p/4915906.html