237. 程序自动分析
先将数字进行离散化,再用并查集合并相等的数字,并将不相等的数字记录下来
最后比较所有不相等的数字,如果两个数字不在一个并查集内,则说明可以满足条件
记得要初始化所有变量和数组
#include <cstdio>
#include <cstring>
#include<tr1/unordered_map>
using namespace std::tr1;
const int N = 2e6 + 5;
int cnt;//离散化的数字
unordered_map<int, int> m;//记录离散化后的数
int bcj[N];//记录每个节点的父节点
int idx, x[N], y[N];
int mapping(int x)//离散化
{
if (m.count(x)) return m[x];
return m[x] = cnt++;
}
void init(int n)//n棵有一个节点的树
{
for (int i = 1; i <= n; i++)
bcj[i] = i;
}
int find(int x)//找到此节点的根节点
{
if (bcj[x] == x)
return x;
else
return bcj[x] = find(bcj[x]);
}
void unite(int x, int y)//合并x和y所在的集合
{
x = find(x), y = find(y);
if (x == y) return;
bcj[x] = y;
}
int main(void)
{
int t, n;
int i, j, e;
bool flag;
scanf("%d", &t);
while (t--){
scanf("%d", &n);
//初始化
init(2 * n);
flag = true;
cnt = idx = 1;
m.clear();
while (n--){
scanf("%d%d%d", &i, &j, &e);
i = mapping(i), j = mapping(j);
if (e == 1){
//相等
unite(i, j);
}
else{
x[idx] = i