题目链接: A. Bear and Friendship Condition
题意
如果A和B是朋友,B和C是朋友,那么A和C是朋友。现在给你一些关系,问你这些关系构成的图是否合理。我们必须把所有的关系都写出来。
思路
用并查集,先求联通块,把联通子图求出来,这个联通块要想合理,边数必须为n*(n-1)/2,(n为联通快节点的个数),我们将这个边数和这个联通快实际的边数比较,看是否相等,不相等该联通块就不合理。
#include <bits/stdc++.h>
using namespace std;
int f[300001];
vector<int>V[150001];
vector<int>F[150001];
int finder(int x)
{
if(x != f[x])
f[x] = finder(f[x]);
return f[x];
}
void combine(int x,int y)
{
int fa,fb;
fa = finder(x);
fb = finder(y);
f[fa] = fb;
}
int main()
{
int n,m,A,B;
cin >> n >> m;
for(int i = 1; i <= n ;i++)
{
f[i] = i;
}
for(int i = 1; i <= m ;i++)
{
cin >> A >> B;
V[A].push_back(B);
V[B].push_back(A);
combine(A,B);
}
for(int i = 1; i <= n ;i++)
{
f[i] = finder(i);
F[f[i]].push_back(i) ;
}
int flag = 1;
for(int i = 1; i <= n ;i++)
{
long long sum = 0;
long long sz = F[i].size();
for(int j = 0; j < sz; j++)
{
sum += V[F[i][j]].size();
}
if(sum != sz * (sz-1))
flag = 0;
}
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}