思路:并查集,每个联通块必须强连通的条件是每个点的度都大于等于联通块中点的数-1,故这道题就很容易了。我发现写并查集的时候把找头结点写成一个函数然后发现会有问题,虽然不知道哪里出了问题。可能是我写拙了。下面给代码:
#include<iostream>
#include<cmath>
#include<queue>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
#include<utility>
#include<map>
#include<vector>
#define maxn 150005
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
const double eps = 1e-8;
int deg[maxn], vis[maxn], size[maxn];
void solve(int x, int y){
int xx = x;
while (vis[xx])
xx = vis[xx];
int yy = y;
while (vis[yy])
yy = vis[yy];
if (xx == yy)
return;
if (size[xx] > size[yy]){
size[xx] += size[yy];
vis[yy] = xx;
}
else{
size[yy] += size[xx];
vis[xx] = yy;
}
}
int main(){
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
size[i] = 1;
while (m--){
int u, v;
scanf("%d%d", &u, &v);
deg[u]++;
deg[v]++;
solve(u, v);
}
bool jud = true;
for (int i = 1; i <= n; i++){
int leader = i;
while (vis[leader])
leader = vis[leader];
if (deg[i] < size[leader] - 1){
jud = false;
break;
}
}
if (jud)
printf("YES\n");
else
printf("NO\n");
}