#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,m,a[1000005],b[1000005],c[1000005],fa[1000005],book[1000005];
vector<int> v[1000005];
int find(int x) {
if(fa[x]==x)return x;
else return fa[x]=find(fa[x]);
}
bool dfs(int p,int c) {
book[p]=c;
for(int i=0; i<v[p].size(); i++) {
if(book[v[p][i]]==c)return 0;
if(!book[v[p][i]]&&!dfs(v[p][i],3-c))return 0;
}
return 1;
}
bool check() {
for(int i=1; i<=n; i++)book[i]=0;
for(int i=1; i<=n; i++) {
if(!book[i]&&!dfs(i,1))return 0;
}
return 1;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>t;
int t2=t;
while(t--) {
cin>>n>>m;
for(int i=1; i<=n; i++)fa[i]=i;
for(int i=1; i<=m; i++) {
cin>>a[i]>>b[i]>>c[i];
if(c[i]%2==0)fa[find(a[i])]=find(b[i]);
}
bool pd=1;
for(int i=1; i<=m; i++) {
if(c[i]%2==1) {
int x=find(a[i]),y=find(b[i]);
if(x==y) {
pd=0;
break;
} else v[x].push_back(y),v[y].push_back(x);
}
}
if(pd&&check())cout<<"Yes\n";
else cout<<"No\n";
for(int i=1; i<=n; i++)v[i].clear();
}
return 0;
}
大体思路是先用并查集把所有颜色相同的点放在一个集合中(相当于一个点),再把颜色不同的点所在的集合相互连边,判定是不是二分图。
求问为什么WA了?玄关。