一道ACM问题,求解
说明考点,给出详细代码,表明注释
最好是用C语言(C++)也行

#include <stdio.h>
#define MAXN 100005
int n;
int head[MAXN], nxt[MAXN], to[MAXN], cnt;
int vis[MAXN], flag[MAXN];
void add(int u, int v) {
nxt[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
}
int dfs(int u, int fa) {
vis[u] = 1;
for (int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if (v == fa) continue;
if (vis[v]) {
flag[u] = 1;
return v;
}
int res = dfs(v, u);
if (res) {
flag[u] = 1;
if (res == u) return 0;
else return res;
}
}
return 0;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
int ans = 0;
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
int res = dfs(i, 0);
if (res) ans++;
}
}
for (int i = 1; i <= n; i++) {
if (flag[i]) ans++;
}
printf("%d\n", ans);
return 0;
}