题解:AT_arc106_b [ARC106B] Values

题目其实不难,乍一眼看可能会误认为是搜索,仔细读题,其实跟并查集相关,因为有两种选择。所以我们用并查集查找相连的边,然后遍历一遍就做完了。

并查集

#include<bits/stdc++.h>
using namespace std;
int n, m, b[400005], a[200005];
int father[200005];
long long sum[200005];
int find(int x){
	return father[x] ? father[x] = find(father[x]) : x;
}
bool vis[200001];
int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i ++) cin >> a[i];
	for(int i = 1; i <= n; i ++) cin >> b[i];
	for(int i = 1, u, v; i <= m; i ++){
		cin >> u >> v;
		u = find(u), v = find(v);
		if(u != v) father[u] = v;
	}
	for(int i = 1; i <= n; i ++) sum[find(i)] += a[i] - b[i];
	for(int i = 1; i <= n; i ++) if(sum[i]) puts("No"), exit(0);
	puts("Yes");
	return 0;
}

posted on 2024-04-10 18:59  zhangzirui66  阅读(10)  评论(0)    收藏  举报  来源

导航