hdu 1829 A Bug's Life 并查集(囧)

2024-06-10 21:08
文章标签 bug 查集 hdu life 1829

本文主要是介绍hdu 1829 A Bug's Life 并查集(囧),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这种用并查集判段是否有同性恋的还是第一次做,并查集的功能也太强大了吧。。囧。。

还是说说思路吧;

就是把这些关系分成两个集合中,同性和异性的,给出的一对数中只要在同一个集合,则他们一定是同性恋;

那么该怎样分成两个集合呢?

下面咱就详细说说过程吧;

这里要用到一个next数组,它记录的是恋人之间的关系:

next【i】=j,就表示i的恋人是j了;

如果next【i】==0,则此时的恋人关系可以确定next【i】=j。

如果next【i】不等于零,则next记录的一定是他的上一个恋人,则next【i】和j是同性关系了,则此时便可以next【i】和j合并到一个数组中了。。

判段next时,一定要注意对i,j都判断。即如果next【i】==0;时next【i】=j,同时判段next【j】与0的关系来确定是否进行合并。。

 

到此这题就可以结束了。。

至此我们知道了并查集不仅可以判段,所给出点的关系中会有几个集合,每个集合有几种元素。

他还可以确定是否会出现同性恋的问题;

啰嗦了这么多就是想更好地掌握并查集的用法来解决更多的实际问题。。

 

#include"stdio.h"
#include"string.h"
int pre[3000],next[3000000];
int find(int k)
{
 if(k!=pre[k])
  pre[k]=find(pre[k]);
 return pre[k];
}
void Union(int x,int y)
{
 x=find(x);
 y=find(y);
 if(x!=y)
  pre[y]=x;
}
int main()
{
 int m,n,i,j=1,k,p,t;
 scanf("%d",&k);
 while(k--)
 {
  scanf("%d%d",&m,&n);
  for(i=1;i<=m;i++)
   pre[i]=i;
  memset(next,0,sizeof(next));
  int flag=0;
  for(i=0;i<n;i++)
  {
   scanf("%d%d",&p,&t);
   if(find(p)==find(t))
    flag=1;
   else
   {
    if(next[p]==0)
     next[p]=t;
    else
    {
     Union(next[p],t);
    }
    if(next[t]==0)
     next[t]=p;
    else
    {
     Union(next[t],p);
    }
   }
  }
  printf("Scenario #%d:\n",j++);
  if(flag)
   printf("Suspicious bugs found!\n\n");
  else
   printf("No suspicious bugs found!\n\n");
 }
 return 0;
}


 

这篇关于hdu 1829 A Bug's Life 并查集(囧)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049276

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i

A bug‘s life 虫子的生活(带权并查集)

题目链接: 2492 -- A Bug's Life (poj.org) 题目描述: 思路: 带权并查集,处理方法基本与食物链(http://t.csdnimg.cn/fSnRr)相同,没什么思维创新 但是一开始WA了几次,有些细节没有注意好,还是需要静下心来,好好分析问题,需要警惕! 参考代码: //#include<bits/stdc++.h>#include<iostream

软件测试Bug等级划分

1. Blocker级别——中断缺陷 客户端程序无响应,无法执行下一步操作。 2. Critical级别――临界缺陷,包括: 功能点缺失,客户端爆页。 3. Major级别——较严重缺陷,包括: 功能点没有满足需求。 4. Normal级别――普通缺陷,包括: 1. 数值计算错误 2. JavaScript错误。 5. Minor级别———次要缺陷,包括: 1. 界面错误与UI

05-5.5.3 并查集的进一步优化

👋 Hi, I’m @Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771@qq.com 喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会

「Debug R」一个Seurat导致的Rstudio网页版经常被终止的bug

在网页版的Rstuio加载Seurat时,等待了很久都没有成功,刷新网页后就出现了如下的提示   报错信息 测试了其他包,例如ggplot2,都没有任何问题,唯独是Seurat出现了问题,因此我用关键词"seurat cause rsession terminated" 进行搜索,发现有人在Rstudio的社区上提出了这个问题,看来我并不是一个人遇到这个问题。 我尝试里帖子h

BUG cn.bing.com 重定向的次数过多,无法搜索内容

BUG cn.bing.com 重定向的次数过多,无法搜索内容 环境 windows 11edge浏览器 详情 使用Microsoft Edge 必应搜索显示"cn.bing.com"重定向次数过多,无法进行正常的检索功能 解决办法 检查是否开启某些科_学_上_网(翻_墙)软件,若开启,将 cn.bing.com、www.bing.com 两个网址加入白名单(PAC直连域名)重

HDU_1013

这个题目尤其需要注意的是开始输入的时候的数的大小,开始输入时有可能非常的大超过了长整型的范围,所以不能开始用整形来存放输入的,,就是开始的时候没有注意到这个问题所以开始的时候一直没有AC,后来就是用一个数组接收输入,然后在经过第一步转化之后就可以用一个整数来装了 #include <iostream>#include <stdlib.h>#include <string>usin