并查集/DFS-CodeForces 1027D-Mouse Hunt

淩亂°似流年 2022-05-15 12:09 249阅读 0赞
  • 并查集/DFS-CodeForces 1027D-Mouse Hunt


  • 题目链接:

D. Mouse Hunt

  • 题目基础:并查集

数据结构-并查集

  • 思路:

题目大意:

给定两个N长度序列,第一个序列表示在每个房间安装捕鼠器的成本,第二个序列是状态图,表示在第 i 个房间的老鼠,下一秒会去到房间 Next_Room[i] (可以选择停留在该房间),求出一定能捉到老鼠的最小成本

题解:

怎样放捕鼠器才能让老鼠一定被捉到?其实就是放在老鼠在房间中活动形成的环路,想要最小成本,在每个环中选出安装捕鼠器成本最低的房间

那要怎么检查老鼠活动是否成环?用到并查集,如果检查的两个元素在一个集合中,说明成环(两种成环状态,自环-当老鼠停留在原来房间,或者多房间成环)

然后用深搜找出每个环安装捕鼠器的最小成本

  • 代码:

    include

    using namespace std;

    define MAX_SIZE 200005

    int Node[MAX_SIZE];
    int Height[MAX_SIZE];
    int Burles[MAX_SIZE];
    int Next_Room[MAX_SIZE];
    int Judge[MAX_SIZE];
    void Init(int n) //初始化结点
    {

    1. for(int i=0;i<=n;i++)
    2. {
    3. Node[i]=-1;
    4. Height[i]=0;
    5. Judge[i]=0;
    6. }

    }

    int Find(int x) //查找集合根
    {

    1. if(Node[x]==-1)
    2. return x;
    3. else
    4. return Node[x]=Find(Node[x]); //查找到x的根时,将x直接连到根

    }

    int Combine(int a,int b) //a b 符合某种关系需合并,如果a b本同属一个集合,返回0
    {

    1. int a_root=Find(a);
    2. int b_root=Find(b);
    3. if(a_root==b_root)
    4. return 0;
    5. if(Height[a_root]<Height[b_root]) //小树a放在b下
    6. Node[a_root]=b_root;
    7. else
    8. {
    9. Node[b_root]=a_root;
    10. if(Height[a_root]==Height[b_root])
    11. Height[a_root]++;
    12. }
    13. return 1;

    }
    int DFS(int x,int y)
    {

    1. if(x==y)
    2. return Burles[x];
    3. return min(DFS(Next_Room[x],y),Burles[x]);

    }

    int main()
    {

    1. int n;
    2. int Res=0;
    3. cin>>n;
    4. Init(n);
    5. for(int i=1;i<=n;i++)
    6. scanf("%d",&Burles[i]);
    7. for(int i=1;i<=n;i++)
    8. {
    9. scanf("%d",&Next_Room[i]);
    10. if(!Combine(i,Next_Room[i])) //两个房间已在集合内,说明有成环情况,标记
    11. Judge[i]=1;
    12. }
    13. for(int i=1;i<=n;i++)
    14. {
    15. if(Judge[i])
    16. Res+=DFS(Next_Room[i],i);
    17. }
    18. cout<<Res<<endl;
    19. return 0;

    }

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    并查集JAVA版框架 并查集是一种用来管理元素分组情况的数据结构。 并查集可以高效地进行如下操作: \--查询元素a和元素b是否属于同一组

    相关

    这个文章是几年前水acm的时候转的, 当时也不知道作者是谁, 要是有人知道的话说一下吧 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的

    相关

    > 题目 > 某学校近期要组织全校同学出去参加某项活动,由于人数众多,学校决定让同学们自行组队,以小组为单位进行活动。假设学校一共n个同学,每个同学有一个唯一的数字作为标签

    相关

    森林: 森林是由若干棵互不相交的树组成,两棵树分别独立,没有交集 ![20181112082744488.png][] 并查集: 并查集的结构和森林十分相似,是

    相关

    来看一个实例,[杭电1232畅通工程][1232] 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性

    相关

    例题: ![输入样例][20190805122001677.png] 输入样例,第一行为一个整数n,代表有n台电脑,编号1-n;接下来进行一系列操作,当输入‘c’时,判

    相关

    一、算法解释 用于解决一些有N个元素的集合应用问题。 1、将每个元素初始化为自身单独成为一个集合。用p\[i\]的值表示该元素所在集合。 ![这里写图片描述][S

    相关

    并查集的作用就是快速判断两个元素是否在同一个集合中,快速将两个集合合并 基本模板 include <iostream> include <a