链接
背景
(CCF) (NOI) (2015) (Day1) (T1) , (Luogu) (P1955/LOJ2129)
题意
给定 (T) 组数据。每组数据有 (n) 个关系给出,形如 ((a,b,c)) 表示变量 (x_a) 和变量 (x_b) 相等( (c=1) )或不等( (c=0) )。判断这些关系能否同时成立。
解法
考虑关系的传递性。等号显然具有传递性,而不等号则不具有。于是考虑把所有相等的变量合并到同一个集合里,如果一个不等关系的两个变量在同一个集合里,则不合法。若所有不等关系都合法,所有的关系就都合法。
(trick)
考虑关系的传递性。并查集最擅长的就是动态维护这个玩意儿。
细节
由于 (a,b leqslant 10^9) ,要先把所有坐标离散化再做并查集,否则空间开不下。
代码
$View$ $Code$
```cpp
#include
using namespace std;
inline int read()
{
int ret=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
ret=(ret<<1)+(ret<<3)+ch-'0';
ch=getchar();
}
return ret*f;
}
int T,n,m,a[2000005],b[2000005],fa[2000005];
bool flag;
struct Relationship
{
int x,y,v;
}re[1000005];
inline bool cmp(Relationship a,Relationship b)
{
return b.v