题意:给你n个点m条边 如果每个联通块都是完全图 则输出YES
题解:并查集处理出联通块。 点的度=当前联通块中的点的个数-1
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 150000 + 20;
int n,m;
int deg[maxn];
int fa[maxn];
int cnt[maxn];
int a,b;
int find(int x) {return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);}
inline void Union(int a, int b){
int x = find(a),y = find(b);
if(x != y) {fa[y] = x;cnt[x] += cnt[y];}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++) {fa[i] = i;cnt[i] = 1;}
for(int i = 1;i <= m;i++){
scanf("%d%d",&a,&b);
Union(a,b);
deg[a]++;deg[b]++;
}
int flag = 1;
for(int i = 1;i <= n;i++){
int x = find(i);
if(cnt[x] != deg[i] + 1) {flag = 0;break;}
}
if(flag) printf("YES\n");
else printf("NO\n");
return 0;
}