rt
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int NR=1e5+5;
int T,n,x,y,m,t,eid,u[NR],v[NR],fa[NR],hd[NR],nxt[NR],to[NR],cnt;
ll a[NR],b[NR];
bool flag;
void connect(int u,int v)
{
to[eid]=v;
nxt[eid]=hd[u];
hd[u]=eid++;
}
int findfa(int u)
{
return fa[u]==u?u:fa[u]=findfa(fa[u]);
}
void add(int u,int v)
{
u=findfa(u),v=findfa(v);
if(u!=v)
{
fa[v]=u;
a[u]+=a[v];
b[u]+=b[v];
}
}
void csh()
{
memset(u,0,sizeof(u));
memset(v,0,sizeof(v));
memset(fa,0,sizeof(fa));
memset(hd,0,sizeof(hd));
memset(nxt,0,sizeof(nxt));
memset(to,0,sizeof(to));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
eid=1,cnt=1;
}
void read()
{
csh();
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
fa[i]=i,hd[i]=0;
}
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=m;i++)
{
cin>>t>>u[cnt]>>v[cnt];
if(t==2)
{
add(u[cnt],v[cnt]);
cnt--;
}
}
}
void solve()
{
read();
for(int i=1;i<=cnt;i++)
{
x=findfa(u[i]),y=findfa(v[i]);
connect(x,y);
connect(y,x);
}
for(int i=1;i<=n;i++)
{
x=findfa(to[hd[i]]);
for(int e=nxt[hd[i]];e;e=nxt[e])
add(x,findfa(to[e]));
}
for(int i=1;flag&&i<=n;i++)
{
if(hd[i])
{
x=findfa(i),y=findfa(to[hd[i]]);
if(x==y)
flag=((a[x]-b[x])!=1);
else
flag=((a[x]-b[x])==(a[y]-b[y]));
}
else
{
if(fa[i]==i)
flag=(a[i]==b[i]);
}
}
}
int main()
{
cin>>T;
while(T--)
{
flag=true;
solve();
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
只过了前10个点
恳求大佬帮条一下(
%%%