给定一个N个顶点,M条边的无向连通图,顶点从1到N编号。 再给出一个dfs生成树。

YIZHIYANG初来乍到 2026-4-7 21:29:19 11 浏览 0 点赞 0 收藏
#include<bits/stdc++.h>
using namespace std; using ll=long long;
int n, m, ans, tim;
vector<int> te[2005], bu, bv;
int tin[2005], out[2005], dep[2005];
void df1(int u, int p) {
    tin[u] = ++tim;
    for(int v : te[u]) if(v != p) df1(v, u);
    out[u] = tim;
}
void df2(int u, int p, int d) {
    dep[u] = d;
    for(int v : te[u]) if(v != p) df2(v, u, d + 1);
}
int dp(int u, int p) {
    int mx = -1, sz = bu.size();
    for(int i = 0; i < sz; ++i) {
        if(bu[i] == u && dep[bv[i]] < dep[u]) mx = max(mx, dep[bv[i]]);
        if(bv[i] == u && dep[bu[i]] < dep[u]) mx = max(mx, dep[bu[i]]);
    }
    for(int v : te[u]) if(v != p) mx = max(mx, dp(v, u));
    if(mx == dep[u] - 1 && p != 0) { ans++; return -1; }
    return mx;
}
int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    if(!(cin >> n >> m)) return 0;
    for(int i = 1, u, v; i <= m; ++i) {
        cin >> u >> v;
        if(i < n) { te[u].push_back(v); te[v].push_back(u); }
        else { bu.push_back(u); bv.push_back(v); }
    }
    int rt = 1, sz = bu.size();
    for(int i = 1; i <= n; ++i) {
        tim = 0; df1(i, 0); int ok = 1;
        for(int j = 0; j < sz; ++j) {
            int u = bu[j], v = bv[j];
            bool a1 = (tin[u] <= tin[v] && out[u] >= out[v]);
            bool a2 = (tin[v] <= tin[u] && out[v] >= out[u]);
            if(!a1 && !a2) { ok = 0; break; }
        }
        if(ok) { rt = i; break; }
    }
    df2(rt, 0, 1); dp(rt, 0);
    cout << ans << '\n';
    return 0;
}

评论

0 条
还没有评论。