跟一位大佬学的很厉害的写法,不断地从别人的优点学习
本题是寻找无向图内,每个连通块的边数与点数是否一样
#include<iostream>
#include<vector>
using namespace std;
const int N = 2e5 + 10;
vector<int>f[N];
bool st[N];
int n , m , edge , vert;
void dfs(int u){
for(auto c : f[u]){
if(!st[c]){
st[c] = true;
edge++ , vert++;
dfs(c);
}else{
edge++;
}
}
}
int main(){
int n , m;
cin>>n>>m;
for(int i = 1 ; i <= m ; i ++){
int x, y;
cin>>x>>y;
f[x].push_back(y);
f[y].push_back(x);
}
for(int i = 1 ; i <= n ; i ++){
if(!st[i]){
vert = 1;
edge = 0;
st[i] = true;
dfs(i);
if(edge / 2 != vert){
cout<<"No"<<endl;
return 0;
}
}
}
cout<<"Yes";
return 0;
}