RT,最后四个点WA。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
int inline read()
{
int ans=0,f=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(isdigit(ch))
{
ans=ans*10+ch-'0';
ch=getchar();
}
return ans*f;
}
struct edge
{
int to,nxt;
}e[200005];
int head[100005];
int t[100005],u[100005],v[100005],a[100005],b[100005];
int s[100005],f[100005];
int col[100005];
int n,m;
int find(int k)
{
if(f[k]==k) return k;
return f[k]=find(f[k]);
}
int cnt;
void clear()
{
for(int i=1;i<=100000;i++)
f[i]=i;
memset(e,0,sizeof e);
memset(head,0,sizeof head);
memset(col,0,sizeof col);
memset(s,0,sizeof s);
cnt=0;
}
void add(int from,int to)
{
cnt++;
e[cnt].to=to;
e[cnt].nxt=head[from];
head[from]=cnt;
}
int sum[2];
bool dfs(int now,int c)
{
col[now]=c;
sum[c-1]+=s[now];
for(int i=head[now];i;i=e[i].nxt)
{
if(col[e[i].to]==c) return 0;
if(col[e[i].to]==0&&!dfs(e[i].to,3-c)) return 0;
}
return 1;
}
void solve()
{
n=read();m=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
b[i]=read();
for(int i=1;i<=m;i++)
{
t[i]=read();u[i]=read();v[i]=read();
}
for(int i=1;i<=m;i++)
if(t[i]==2)
f[find(u[i])]=find(v[i]);
for(int i=1;i<=n;i++)
s[find(i)]+=b[i]-a[i];
for(int i=1;i<=m;i++)
if(t[i]==1)
{
int x=find(u[i]),y=find(v[i]);
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++)
{
if(find(i)==i&&col[i]==0)
{
sum[0]=sum[1]=0;
bool ok=dfs(i,1);
if(ok&&sum[1]!=sum[0])
{
cout<<"NO"<<'\n';
return;
}
if(!ok&&(sum[1]+sum[0])%2==1)
{
cout<<"NO"<<'\n';
return;
}
}
}
cout<<"YES"<<'\n';
}
signed main()
{
int T=read();
while(T--) clear(),solve();
return 0;
}