这个题目一看就是用并查集,有N个国家代表,在M行给出两两之间的关系,敌人或者朋友,(当然如果该关系跟已知关系冲突,则输出-1)

关系的几个约束条件时这样的

在朋友方面,朋友的朋友就是自己的朋友,这个就是并查集。

在敌人方面,

x和其所有朋友的敌人都是敌人。

x和其所有敌人的敌人都是朋友。

主要是这个敌人的状态不太好表示,不是一个并查集能做到的,我一开始犯糊涂,直接用个图把x的敌人存贮起来,但是因为每次交新的朋友或者敌人,就要搜索全图,而且要把自己的敌人圈更新到整个朋友圈,这样不仅难以实现,复杂度也是相当高

后来就发现一个神级方法,简单易用,即,每个国家都有自己的对立面(实际上不存在),作用是这样的,x的对立面为x+n,如果某国y要跟x做敌人,则,y就和x+n放在同一个并查集里。这样就不会跟本体有影响,但是又达到了结仇的目的。

这样的话,x和y结盟,则 x和y属于一个集合, x+n和y+n属于同一集合(把对立面也绑定,再结仇的时候无论是和x还是y结仇,都会同时跟两个国家结仇,这样就其实就达到了第一个条件)。

如果x和y结仇,则x和y+n在同一集合,同时,y和x+n在同一集合。(结仇之后,如果两个国家有共同的仇人,则通过并查集操作,必定到了同一个集合,这样就满足了仇人的仇人是朋友的条件)

这样判断前后是否冲突,也可以根据这几个条件,如果当前操作是结仇,则一旦发现x和y已经是一个集合(或者他们的对立面),则冲突

如果当前是结盟,一旦发现x和y+n是一个集合  或者 y和x+n是一个集合,则冲突。

#include <iostream>
#include <cstdio>
#define N 10010
using namespace std;
int f[*N];
int n,x,y,c;
void init()
{
for (int i=;i<=*n;i++){
f[i]=i;
}
}
int findset(int a)
{
if (a!=f[a])
f[a]=findset(f[a]);
return f[a];
} void solve()
{
int r1,r2,r3,r4;
r1=findset(x);
r2=findset(y);
r3=findset(x+n);
r4=findset(y+n);
//cout<<r1<<" "<<r2<<" "<<r3<<" "<<r4<<endl;
if (c==)
{
if (r1==r4){
puts("-1");
return;
}
f[r1]=r2;
f[r3]=r4;
return;
}
if (c==)
{
if (r1==r2)
{
puts("-1");
return;
}
f[r1]=r4;
f[r2]=r3;
return;
}
if (c==)
{
if (r1==r2)
puts("");
else
puts("");
}
if(c==)
{
if (r1==r4)
puts("");
else
puts("");
} }
int main()
{
int i,j;
scanf("%d",&n);
init();
while (scanf("%d%d%d",&c,&x,&y))
{
if (!c) break;
solve();
}
return ;
}

UVA 10158 并查集的经典应用的更多相关文章

  1. poj 1611:The Suspects(并查集,经典题)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 21472   Accepted: 10393 De ...

  2. UVa 10129 (并查集 + 欧拉路径) Play on Words

    题意: 有n个由小写字母的单词,要求判断是否存在某种排列使得相邻的两个单词,前一个单词末字母与后一个单词首字母相同. 分析: 将单词的两个字母看做节点,则一个单词可以看做一条有向边.那么题中所求的排列 ...

  3. UVa 11987 并查集 Almost Union-Find

    原文戳这 与以往的并查集不同,这次需要一个删除操作.如果是叶子节点还好,直接修改父亲指针就好. 但是如果要是移动根节点,指向它的所有子节点也会跟着变化. 所以要增加一个永远不会被修改的虚拟根节点,这样 ...

  4. POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典

    题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/ 题意:给出动物之间的关系,有几种询问方式,问是真话还是假话. 定义三种偏移关系: x->y 偏移量 ...

  5. leetcode 76 dp& 强连通分量&并查集经典操作

    800. Similar RGB Color class Solution { int getn(int k){ return (k+8)/17; } string strd(int k){ char ...

  6. ACM/ICPC 之 并查集-食物链(POJ1182)

    并查集的经典题型,POJ上题目还是中文= =,一般看到中文题都会感觉不太简单,这道题的数学归纳用得比较多,可以简化代码,挺有意思的. 同类型的题目还有POJ1703,比这个要简单,想了解并查集基本介绍 ...

  7. (中等) POJ 1703 Find them, Catch them,带权并查集。

    Description The police office in Tadu City decides to say ends to the chaos, as launch actions to ro ...

  8. 并查集--CSUOJ 1601 War

    并查集的经典题目: CSUOJ 1601: War Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 247  Solved: 70[Submit][Sta ...

  9. 【带权并查集】poj1182 食物链

    带权并查集,或者叫做种类并查集,经典题. http://blog.csdn.net/shuangde800/article/details/7974668 这份代码感觉是坠吼的. 我的代码是暴力分类讨 ...

随机推荐

  1. 033-PHP对一个数组先奇后偶,然后再进行从大到小排序

    <?php function Compare($str1, $str2) { if (($str1 % 2 == 0) && ($str2 %2 == 0)) { if ($st ...

  2. HDU_4912 Path on the tree 2014多校5 贪心+LCA

    当时刚学LCA-tarjan不久,就比赛有这个题,但没想到还是没做出来..一开始以为是DP来着,没想到是贪心,想想也对,从树的最下层开始,每次遇到询问的点,就找到他们的LCA(路径里面必经LCA),然 ...

  3. oracle中判断"非"

    在oracle中判断为"非"最常见的两种情况,一个是"不等于",一个的"非空". 通过查找资料得知,oracle中判断不等于的方法有好多种: ...

  4. springboot - 使用ErrorAttributes 在我们自定义的 ErrorController中

    1.概览 基于<springboot - 映射 /error 到自定义且实现了ErrorController的Controller>改造,仅将MyCustomErrorController ...

  5. Day 13:File类的常用方法

    路径问题: 绝对路径: 该文件在硬盘上 的完整路径.绝对路径一般都是以盘符开头的. 相对路径:  相对路径就是资源文件相对于当前程序所在的路径.  . 当前路径   .. 上一级路径  注意: 如果程 ...

  6. ESP8266 SDK开发: 外设篇-串口

    串口分布 串口切换说明 1.默认所有的数据都使用串口0输出 官方提供了函数可以选择printf利用哪一个串口输出 配置printf使用串口1打印输出,波特率115200 (注:这样配置对于调试程序很有 ...

  7. 创建maven项目时pom.xml报错的解决方法

    创建maven项目时pom.xml时: 出现如下报错信息: Failure to transfer commons-lang:commons-lang:jar:2.1 from https://rep ...

  8. android 动画基础绘——view 动画

    前言 对android 动画的整理,android 动画分为view动画(也叫补间动画),帧动画,属性动画. 看到这几个概念,让我想起了flash这东西.如果需要查各种动画具体的含义,那么可以去查询f ...

  9. java课程课后作业190502之单词统计

    自己想的方法一直都不是很好,但是又一直忘了改自己的算法,只能硬着头皮接着用自己以前的老方法了 第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后 ...

  10. cnblogs今天挂了

    刚打算搬进来常驻cnblogs,好死不死,它今天11点40分左右挂了.真是不让人省心: 今天把这后面这几个月的随笔放过来,希望能不会被清掉: