http://poj.org/problem?id=1182

一个利用并查集的经典题目。

思路:在网上看到别人的思路,觉得方法还是挺不错的。

首先,开辟一个3*n的数组belg,用来存b和c的关系,在belg[c+m]存,c是被谁吃的,belg[c+2*m]存b是吃谁的。

bool judge(int x,int y) {return (Find(x)==Find(y));}

如果judge(b,c+m)和 judge(b,c+2*m)都为假的话,那么可以说明,b和c是在同类。

然后合并b,c。b+m,c+m。b+2m,c+2m。

第一个judge可以判断,b不会吃c,第二个Judge可以判断c也不会吃b,所以,b,c肯定是同类。

如果judge(b,c)和judge(b,c+2*m)都为假的话,那么可以说明,c是被b吃的,然后合并b,c+m。b+m,c+2*m。b+*2m,c;

第一个judge可以判断b和c不是同一类,第二个judge可以判断c不会吃b,那么就可以说明c是被b吃的。c是被b吃的,那么说明,c+m存的就是b,所以c+m和b合并。之后的也是同样的意思。

 #include <stdio.h>
#include <string.h> int belg[]; int Find(int x) //Find 的迭代写法。
{
int _x=x,_b;
while(_x!=belg[_x])
{
_x=belg[_x];
}
while(x!=belg[x])
{
_b=belg[x];
belg[x]=_x;
x=_b;
}
return _x;
} bool judge(int x,int y) {return (Find(x)==Find(y));} void unite(int x,int y)
{
int root1=Find(x);
int root2=Find(y);
if(root1!=root2) belg[root1]=root2;
} int main()
{
int m,n,a,b,c,ans=;
// freopen("in.txt","r",stdin);
scanf("%d%d",&m,&n);
for(int i=;i<=m*;i++)
belg[i]=i;
while(n--)
{
scanf("%d%d%d",&a,&b,&c);
if(b>m||c>m) ans++;
else if(a==)
{
if(judge(b,c+m)||judge(b,c+*m)) ans++;
else { //b,c是同类时,合并所有的信息。
unite(b,c);
unite(b+m,c+m);
unite(b+*m,c+*m);
}
}
else {
if(judge(b,c)||judge(b,c+*m)) ans++;
else { //b,c不是同类时,合并那些是同类的信息。
unite(b,c+m);
unite(b+m,c+*m);
unite(b+*m,c);
}
}
}
printf("%d\n",ans);
return ;
}

最新文章

  1. struts2是如何加载相关的package元素节点信息的
  2. salesforce 零基础学习(二十九)Record Types简单介绍
  3. Spring定时器,定时执行(quartz)
  4. maven实战_01_搭建maven开发环境
  5. MYSQL基础笔记(二)-SQL基本操作
  6. MDN &gt; Web technology for developers &gt; HTTP
  7. Android开发app如何设定应用图标下的应用名称为汉字以及自定义图标
  8. spart快速大数据分析学习提纲(一)
  9. node.js 入门(一)安装
  10. PHP截取汉字乱码问题解决方法mb_substr函数的应用
  11. javascript 控制台输出 图片 console.log 真强大 真佩服你们的创造力
  12. 【SSH系列】深入浅出SpringMvc+入门Demo
  13. 爬虫-Python爬虫常用库
  14. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)
  15. EasyPR源码剖析(1):概述
  16. POS VB
  17. _reincarnation
  18. Some questions after Reading 《移山之道》
  19. switch case语句重点概况
  20. UVA12888 【Count LCM】(莫比乌斯反演)

热门文章

  1. RabbitMQ安装后不能运行 Error: unable to connect to node nodedown
  2. HTML5实战与剖析之触摸事件(touchstart、touchmove和touchend)(转)
  3. Linux查看软件安装路径
  4. YII2 实现后台操作记录日志(转)
  5. Android Studio-设置放大代码编辑区
  6. CString
  7. objective-c与c++的差异
  8. 使用Minify来优化网站性能
  9. ELK常见错误分析(转)
  10. eclipse无法自动识别出svn项目