杭电多校赛第8场 1007 Solubility

发布时间 2023-08-18 10:57:27作者: 沙野博士

有n种液体,有些液体可以相融,且相融具有传递性。比如A与B相融,B与C相融,那么A与C也相融。

现在给出一些液体之间的相融关系,最后询问给定的k种液体能否两两相融。

用并查集将可以相融的液体合并,最后查询就是看这k种液体是不是在同一个集合内。

这题是多组测试,在判断k种液体是否相融的时候,一经发现立即结束了当前的测试点。但是这个测试点的数据还没有完全读入进去,所以导致后面的测试wa掉。

#include<bits/stdc++.h>
using namespace std;

int f[100005] = {0};

void ini(int n)
{
	for(int i = 1; i <= n; i++)
		f[i] = i;
}

int F(int a)
{
	if(f[a] == a)return a;
	return f[a] = F(f[a]);
}

void solve()
{
	int n, m;
	cin >> n >> m;
	ini(n);
	int u, v;
	for(int i = 1; i <= m; i++)
	{
		cin >> u >> v;
		f[F(u)] = F(v);
	}
	
	int k;
	cin >> k;
	int tmp;
	cin >> tmp;
	int nn = F(tmp);
	bool flag = false;
	for(int i = 2; i <= k; i++)
	{
		cin >> tmp;
		if(flag)continue;
		if(nn != F(tmp))
		{
			//cout << "NO\n";
			flag = true;
		}
	}
	if(flag)
	{
		cout << "NO\n";
	}
	else cout << "YES\n";
	return;
}

int main()
{
	ios::sync_with_stdio(false);
	int T;
	cin >> T;
	while(T--)
	{
		solve();	
	}
	
	return 0;
}