50pts 求助
查看原帖
50pts 求助
761137
Double_Light楼主2024/10/3 18:36

似乎只能过 m=1m=1 的情况()

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int T;
int n,m;
int a[100005],b[100005];
struct EDGE{
	int u,v,nxt;
}edge[200005];
int head[100005],tot;
void add(int u,int v){
	edge[++tot]={u,v,head[u]};
	head[u]=tot;
}
struct query{
	int opt,u,v;
}q[100005];
bool cmp(query x,query y){
	return x.opt>y.opt;
}
int fa[100005];
int Find(int x){
	if(x==fa[x])return x;
	return fa[x]=Find(fa[x]);
}
void Union(int x,int y){
	if(Find(x)==Find(y))return ;
	fa[Find(x)]=Find(y);
}
int color[100005];
int vis[100005];
bool is,f;
int suml,sumr;
void dfs(int x,int fa,int col){
	if(col==1)suml+=a[x]-b[x];
	else sumr+=a[x]-b[x];
	color[x]=col;
	vis[x]=1;
	for(int i=head[x];i;i=edge[i].nxt){
		int v=edge[i].v;
		if(!vis[Find(v)]){
			if(col==1)dfs(Find(v),x,2);
			else dfs(Find(v),x,1);
		}
		else if(color[Find(v)]==col)is=0;
	}
}
signed main(){
	cin>>T;
	while(T--){
		f=1;
		memset(head,0,sizeof(head));
		memset(edge,0,sizeof(edge));
		memset(color,0,sizeof(color));
		memset(vis,0,sizeof(vis));
		tot=0;
		cin>>n>>m;
		for(int i=1;i<=n;i++)fa[i]=i;
		for(int i=1;i<=n;i++)cin>>a[i];
		for(int i=1;i<=n;i++)cin>>b[i];
		for(int i=1;i<=m;i++)cin>>q[i].opt>>q[i].u>>q[i].v;
		sort(q+1,q+m+1,cmp);
		for(int i=1;i<=m;i++){
			if(q[i].opt==2){
				int u=q[i].u,v=q[i].v;
				Union(u,v);
				a[v]+=a[u];
				b[v]+=b[u];
			}
			else{
				add(Find(q[i].u),Find(q[i].v));
				add(Find(q[i].v),Find(q[i].u));
			}
		}
		for(int i=1;i<=n;i++){
			if(!vis[Find(i)]){
				is=1;suml=0;sumr=0;
				dfs(Find(i),0,1);
				if(is&&suml!=sumr)f=0;
				if(!is&&((suml^sumr)&1))f=0;
			}
		}
		if(f)cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}
/*
1
2 1
2 3
3 3
1 1 2
*/
2024/10/3 18:36
加载中...