求问为什么这个思路会WA倒数第二个点,玄关
  • 板块P11640 Graph
  • 楼主ksCIOer
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/29 16:23
  • 上次更新2025/1/29 17:04:53
查看原帖
求问为什么这个思路会WA倒数第二个点,玄关
758951
ksCIOer楼主2025/1/29 16:23
#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了?玄关。

2025/1/29 16:23
加载中...