• 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
  • 相关阅读:
    cs硕士妹子找工作经历【阿里人搜等互联网】
    EJB到底是什么,真的那么神秘吗??
    到底EJB是什么
    安全性测试:
    掌握 Promise 的逻辑方法
    VS2019 不能下载的解决办法
    Java8基础系列-Stream
    周期模型(典型的几种):
    软件生存周期及其模型是什么?
    试述软件的概念和特点?软件复用的含义?构件包括哪些?
  • 原文地址:https://www.cnblogs.com/gaoss/p/4915906.html
Copyright © 2020-2023  润新知