D. Cow and Snacks

题意:有n种小吃,m个人,每个人有两种喜欢的小吃,当一个人遇到两种自己都喜欢的小吃,可以都吃掉,问在最优的吃小吃顺序下,不能吃到自己喜欢的小吃的人数最少是多少?

题解:把n种小吃当作n个点,m个人当作m条边,每个连通图里面第一个吃的人,一定是可以吃两种自己喜欢的小吃。每次判断这条边是否在已有的联通图里面,对已经在连通图里面的边,是一定不能吃到小吃,若不在连通图里面,则一定可以吃到小吃,用cnt统计可以吃到小吃的人数,最后m-cnt就是答案

#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
using namespace std;
int p[], r[];
int n,t=;
void init()//初始化集合,每个元素的老板都是自己
{
for (int i = ; i <= n; i++)
{
p[i] = i;
}
} int find(int x)//查找元素x的老板是谁
{
if (x == p[x])
return x;
else
return p[x] = find(p[x]);
} void join(int x, int y)//合并两个集合
{
int xRoot = find(x);
int yRoot = find(y); if (xRoot == yRoot) //老板相同,不合并
return;
//cnt=cnt-1;
if (r[xRoot] < r[yRoot]) //r[i]是元素i所在树的高度,矮树的根节点认高树的根节点做老板
p[xRoot] = yRoot;
else if (r[xRoot] > r[yRoot])
p[yRoot] = xRoot;
else
{
p[yRoot] = xRoot;//树高相同,做老板的树高度要加一
r[xRoot]++;
}
} bool sameRoot(int x, int y)//查询两个元素的老板是否相同
{
return find(x) == find(y);
}
//这里也可以用cnt求不同子集个数,初始化cnt=n,每加入一条边,cnt=cnt-1;
int main()
{
ios::sync_with_stdio(false);
int m,cnt=;
cin>>n>>m;
init();
for(int i=;i<m;i++)
{
int x,y;
cin>>x>>y;
if(!sameRoot(x,y))
{
join(x,y);
cnt++;
}
}
cout<<m-cnt<<endl;
return ;
}

最新文章

  1. Oracle 中的伪列
  2. testng教程之testng.xml的配置和使用,以及参数传递
  3. 阿里云SLB双机IIS多站点负载均衡部署笔记
  4. spider_jpg
  5. Oracle 使用小计(2)
  6. UITouch 触摸事件处理(实例)
  7. &quot;奇葩家园“之genymotion工具篇
  8. Easy steps to create a System Tray Application with C# z
  9. 写的一个判断注册Email是否是个人邮件,而不是公司邮件的方法
  10. 可执行文件(ELF)格式的理解
  11. asp.net打印网页后自动关闭网页【无需插件】
  12. Angular - - $resource 更高端的数据交互
  13. css中的那些布局
  14. sklearn.linear_model.LogisticRegression参数说明
  15. Java框架spring Boot学习笔记(十):传递数据到html页面的例子
  16. 推举算法 AdaBoost 哥德尔奖 Godel Prize
  17. 基于TransactionScope类的分布式隐式事务
  18. Javascript全选,反选,全不选的实现代码
  19. MVC4发布到IIS,出现HTTP 错误 404.0 - Not Found的解决方法
  20. 编写Makefile规则

热门文章

  1. php的分层思想
  2. mysql5.7修改root密码
  3. Vue中组件之间的通信方式
  4. 案例:WLC HA主WLC进入维护模式
  5. HDU1024 Max Sum Plus Plus (优化线性dp)
  6. java中对于多态的一个实例分析
  7. nikic / PHP-Parser 包的简单实用
  8. JS 上传图片压缩,原比例压缩
  9. python脚本监听nginx是否运行
  10. Codeforces Round #600 (Div. 2) - B. Silly Mistake(模拟)