简单易懂,上题目
虽然我也不知道小明为什么会喜欢这种奇葩的东西,但是这道题目还是要做的
思路:找出树,判断是否闭环,不是闭环则为计数
Code:
#include <bits/stdc++.h>//华丽开头
using namespace std;
int n, m, u, v, cnt;
bool flag, vis[100001];
vector<int> g[100001];
/*
根据题目意思,1和8,是2个树,5不是树
*/
//u是当前节点,fa是父节点,避免重复绕圈
void dfs(int u, int fa) {
vis[u] = true;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (v == fa) {
continue;
}
//如果没有访问过,则继续下一层的孩子节点
//如果访问过,则代表它是一个环,
//不是题目要求的树,所以要设成false
if (!vis[v]) {
dfs(v, u);
}
else {
flag = false;
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
flag = true;
//求连通块的同时,要求一棵树,不能有环
dfs(i, -1);
//cout<<i<<"#"<<flag<<endl;
cnt += flag;
}
}
cout << cnt;
//return 0;好习惯,但我没有.....
}