[kuangbin带你飞]专题六 最小生成树 J - Borg Maze

J - Borg Maze

题目链接:https://vjudge.net/contest/66965#problem/J

题目:

博格是一个非常强大的种族,它来自银河系的三角洲象限。博格集体是用来描述博格文明群体意识的术语。每个博格人都通过复杂的子空间网络与集体联系,确保每个成员得到持续的监督和指导。

你的任务是帮助博格(是的,真的)通过开发一个程序,帮助博格估计扫描迷宫的最低成本,以便同化隐藏在迷宫中的外星人,在北部,西部,东部和南部移动脚步。棘手的是,搜索的开始是由100多个人组成的。每当外星人被同化时,或者在搜索开始时,该群体可能会分成两组或更多组(但他们的意识仍然是集体的)。搜索迷宫的成本被定义为搜索中涉及的所有组所覆盖的总距离。也就是说,如果原始组走五步,则分成两组,每组步行三步,总距离为11 = 5 + 3 + 3。
输入
    在输入的第一行有一个整数,N <= 50,给出输入中的测试用例数。每个测试用例以包含两个整数x,y的行开始,使得1 <= x,y <= 50.然后,跟随y行,每行x个字符。对于每个角色,空格“`”代表开放空间,哈希标记“#”代表障碍墙,大写字母“A”代表外星人,大写字母“S”代表‘‘代表搜索的开始。迷宫的周长总是关闭的,即没有办法从“S”的坐标中走出来。迷宫中至多有100个外星人,每个人都可以到达。
产量
    对于每个测试用例,输出一行包含成功搜索迷宫的最小成本,不留外来人。
样本输入

2
    6 5
    #####
    #A#A ##
    # # 一个#
    #S ##
    #####
    7 7
    #####
    #AAA ###
    # 一个#
    #S ###
    ##
    #AAA ###
    #####

样本输出

8
    11

思路:这题一开始没看懂啥意思,百度了看的,先bfs求出每个A到S的距离,然后用最小生成树求出最小边权和即可

//
// Created by hanyu on 2019/8/1.
//
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#include<math.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+7;
int father[maxn];
int book[600][600],point[600][600];
char str[600][600];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
struct Point{
    int x,y,step;
};
struct Node{
    int u,v,w;
    bool operator<(const Node &other)const{
        return this->w<other.w;
    }
}node[maxn];
int find(int x)
{
    if(x==father[x])
        return x;
    return father[x]=find(father[x]);
}
int n,m,num,cnt;
void bfs(int sx,int sy)
{
    memset(book,0,sizeof(book));
    Point now,next;
    queue<Point>qu;
    now.x=sx;
    now.y=sy;
    now.step=0;
    book[sx][sy]=1;
    qu.push(now);
    while(!qu.empty())
    {
        now=qu.front();
        qu.pop();
        for(int i=0;i<4;i++)
        {
            next.x=now.x+dir[i][0];
            next.y=now.y+dir[i][1];
            next.step=now.step+1;
            if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&str[next.x][next.y]!=‘#‘&&!book[next.x][next.y])
            {
                book[next.x][next.y]=1;
                qu.push(next);
                if(str[next.x][next.y]==‘S‘||str[next.x][next.y]==‘A‘)
                {
                    node[num].u=point[sx][sy];
                    node[num].v=point[next.x][next.y];
                    node[num++].w=next.step;
                }

            }
        }
    }
}
int kru(int n)
{
    int res=0;
    for(int i=0;i<cnt;i++)
        father[i]=i;
    for(int i=0;i<n;i++)
    {
        int uu=find(node[i].u);
        int vv=find(node[i].v);
        if(uu==vv)
            continue;
        else
        {
            father[uu]=vv;
            res+=node[i].w;
        }
    }
    return res;
}
int main()
{
    int T;
    scanf("%d",&T);
    char str1[maxn];
    while(T--)
    {
        scanf("%d%d",&m,&n);
        gets(str1);
        cnt=0;
        num=0;
        memset(point,0,sizeof(point));
        for(int i=0;i<n;i++)
        {
            gets(str[i]);
            for(int j=0;j<m;j++)
            {
                if(str[i][j]==‘S‘||str[i][j]==‘A‘)
                    point[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‘)
                    bfs(i,j);
            }
        }
        sort(node,node+num);
        printf("%d\n",kru(num));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Vampire6/p/11285802.html

时间: 2024-10-05 20:46:23

[kuangbin带你飞]专题六 最小生成树 J - Borg Maze的相关文章

[kuangbin带你飞]专题六 最小生成树

学习最小生成树已经有一段时间了 做一些比较简单的题还算得心应手..花了三天的时间做完了kuangbin的专题 写一个题解出来记录一下(虽然几乎都是模板题) 做完的感想:有很多地方都要注意 n == 1 注意double 的精度问题 poj 1251 模板题 大写字母减去'A'+1即是它的编号 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<m

[kuangbin带你飞]专题六 最小生成树 G - Arctic Network

G - Arctic Network 题目链接:https://vjudge.net/contest/66965#problem/G 题目: 国防部(DND)希望通过无线网络连接几个北部前哨站.在建立网络时将使用两种不同的通信技术:每个前哨站都有一个无线电收发器,一些前哨站还有一个卫星信道.    任何带卫星频道的两个前哨站都可以通过卫星进行通信,无论其位置如何.否则,两个前哨只有当它们之间的距离不超过D时才可以通过无线电进行通信,这取决于收发器的功率.更高的功率产生更高的D但成本更高.由于采购

[kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads

给一个n个点的完全图 再给你m条道路已经修好 问你还需要修多长的路才能让所有村子互通 将给的m个点的路重新加权值为零的边到边集里 然后求最小生成树 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 #define cl(a,b) memset(a

[kuangbin带你飞]专题六 最小生成树 K - The Unique MST (判断最小生成树是否唯一)

K - The Unique MST 题目链接:https://vjudge.net/contest/66965#problem/K 题目: 给定连接的无向图,告诉它的最小生成树是否唯一. 定义1(生成树):考虑连通的无向图G =(V,E). G的生成树是G的子图,比如T =(V',E'),具有以下属性:    1. V'= V.    2.T是连接的和非循环的. 定义2(最小生成树):考虑边加权,连通,无向图G =(V,E). G的最小生成树T =(V,E')是总成本最小的生成树. T的总成本

[kuangbin带你飞]专题六 生成树

A. POJ 1679  The Unique MST 题意:最小生成树是不是唯一的. 思路:参考http://www.cnblogs.com/onlyAzha/p/4793031.html B. HDU 4081  Qin Shi Huang's National Road System 题意:秦始皇想要在城市之间修路.徐福可以用法力帮助他修一条路.秦始皇希望修一条路使得剩下的路需要的花费B最少,而徐福希望这条路所连的两个城市的人口数之和A最大.权衡后他们决定选择A/B的值最大的边来修建. 思

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher :G - Power Strings POJ - 2406(kmp简单循环节)

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher G - Power Strings POJ - 2406 题目: Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of

kuangbin带你飞专题一 简单搜索 题解

目录 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题一 简单搜索 总结:用时2天半终于把这个专题刷完了 对于最基础的dfs bfs 路径打印 状态转移也有了一点自己些微的理解 其实2天半可以压缩到1天半的 主要是自己太懒了...慢慢加油刷bin神的专题呀 从大二下学期开始学算法 一开始就知道这个专题 一开始对于这个专题里的所有问题感觉都好难啊..就直接放弃了 看lrj的书 现在看到这个专题还挺唏嘘的吧 突然觉得思维和想法也不是很难 果然是那个时候心不静&还是储量不够吗

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher B - Oulipo HDU - 1686(kmp)

B - Oulipo HDU - 1686 题目链接:https://vjudge.net/contest/70325#problem/B 题目: The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book: Tout avait Pa

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher H - Seek the Name, Seek the Fame POJ - 2752(kmp的next数组应用)

H - Seek the Name, Seek the Fame POJ - 2752 题目链接:https://vjudge.net/contest/70325#problem/H 题目: The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. Th