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 ;
}

poj 1182的更多相关文章

  1. poj 1182:食物链(种类并查集,食物链问题)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description ...

  2. POJ 1182 食物链

    G - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  3. 食物链 poj 1182

    C - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  4. POJ 1182 食物链(种类并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63592   Accepted: 18670 Description ...

  5. poj 1182 食物链 (带关系的并查集)

      食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动 ...

  6. POJ 1182——食物链——————【种类并查集】

    食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status P ...

  7. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  8. poj 1182 食物链 (并查集)

    http://poj.org/problem?id=1182 关于并查集 很好的一道题,开始也看了一直没懂.这次是因为<挑战程序设计竞赛>书上有讲解看了几遍终于懂了.是一种很好的思路,跟网 ...

  9. POJ 1182 (经典食物链 /并查集扩展)

    (參考他人资料) 向量偏移--由"食物链"引发的总结 http://poj.org/problem?id=1182这道食物链题目是并查集的变型.非常久曾经做的一次是水过的,这次 ...

随机推荐

  1. Lua 之数据结构

    Lua 之数据结构 数组 通过整数下标访问的table中的元素,即是数组,下标默认从1开始. 一个创建二维数组的例子: mt = {} , do mt[i] = {} , do mt[i][j] = ...

  2. [webgrid] – header - (How to Add custom html to Header in WebGrid)

    How to Add custom html to Header in WebGrid MyEvernote Link Posted on March 30, 2013by mtryambake Ho ...

  3. nginx 日志切割

    #!/usr/bin/python #-*-coding:UTF-8-*- import time import os logdir='/data/log/nginx' nginxpath='XX/l ...

  4. Sql Server作业

    参考资料: http://jingyan.baidu.com/article/49ad8bce7287315834d8fab4.html

  5. XHTML的若干注意点

    1.重要的兼容性提示: 你应该在 "/" 符号前添加一个额外的空格,以使你的 XHTML 与当今的浏览器相兼容. 2.XML对大小写敏感. 3.在 XHTML 中是不允许使用空标签 ...

  6. 发布自己的包到Nuget上

    1.首先下载Nuget.exe https://dist.nuget.org/index.html 2.设置环境变量  设置apikey nuget setApiKey <my_api_key& ...

  7. js 的强制 类型 转换cast, 伪对象?

    拼音输入法简单快捷, 但是重码多, 所以要看清了再选择, 不然会影响输入正确性和 心情的! js的类型 隐式 转换? 是指, 根据 表达式的操作符号 如if(), + , && , j ...

  8. 从svn检出项目---------不是web项目

    javaweb项目从svn检出变成java项目 javaweb项目从svn检出后变成java项目,解决办法是: 1.项目右键–properties–Project Facets,勾选上Dynamic ...

  9. Markdown 写作工具选择

    Markdown 写作工具选择 候选产品 参考了少数派网站 markdown 写作工具2015年度盘点 http://sspai.com/32483, Windows 下 Markdown 的编辑工具 ...

  10. [百度地图] ZMap 与 MultiZMap 封装类说明;

    ZMap.js 与 MultiZMap 说明 1. ZMap 与 MultiZMap 都是封装一些地图常用的使用方法,类方法功能大多使用 prototype 原型 实现: ZMap 在一个页面只能使用 ...