codeforces 771 A

题目链接: 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值