AcWing 237. 程序自动分析
离散化+并查集
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int T;
int n, m;
unordered_map<int, int>S;
int p[N];
struct Q{ //询问
int a, b, e;
}query[N];
int get(int x){ //离散化
if(S.count(x) == 0) S[x] = ++ n;
return S[x];
}
int find(int x){ //找祖宗节点
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
int main()
{
scanf("%d", &T);
while(T -- ){
n = 0;
S.clear();
scanf("%d", &m);
for(int i = 1; i <= m; i ++ ){
int a, b, e;
scanf("%d%d%d", &a, &b, &e);
query[i] = {get(a), get(b), e};
}
for(int i = 1; i <= n; i ++ ) p[i] = i;
for(int i = 1; i <= m; i ++ ){
if(query[i].e == 1){
int fa = find(query[i].a), fb = find(query[i].b);
p[fa] = fb;
}
}
bool f = false;
for(int i = 1; i <= m; i ++ ){
if(query[i].e == 0){
int fa = find(query[i].a), fb = find(query[i].b);
if(fa == fb){
f = true;
// break;
}
}
}
if(f) printf("NO\n");
else if(!f) printf("YES\n");
}
return 0;
}