杭电多校赛第8场 1007 Solubility
有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;
}