您的位置:首页 > 其它

CodeForces 791B Bear and Friendship Condition【并查集】

2017-03-22 13:13 411 查看
题目链接:http://codeforces.com/contest/791/problem/B

题意:给你一个社交网络,问你这个网络是否合法,也就是1认识2,2认识3,1就必须认识3

解析:其实也就给你一个图,如果这个社交网络合法那就是他所有的连通块里的节点个数-1等于连通块里节点的度数

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <set>
using namespace std;
const int maxn = 2e5+100;
int fa[maxn],cnt[maxn],s[maxn];
void init(int n)
{
for(int i=0;i<=n;i++)
fa[i] = i;
memset(cnt,0,sizeof(cnt));
memset(s,0,sizeof(s));
}
int getFa(int x)
{
if(x==fa[x])
return fa[x];
return fa[x] = getFa(fa[x]);
}
void merge(int u,int v)
{
int t1 = getFa(u);
int t2 = getFa(v);
if(t1!=t2)
fa[t2] = t1;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int flag = 0;
init(n);
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d %d",&a,&b);
merge(a,b);
cnt[a]++;
cnt[b]++;
}

for(int i=1;i<=n;i++)
{
int tmp = getFa(i);
s[tmp]++;
}
for(int i=1;i<=n;i++)
{
int t1 = getFa(i);
if(s[t1]-1!=cnt[i])
{
flag = 1;
break;
}
}
if(flag)
puts("NO");
else
puts("YES");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: