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