zcmu1369: Graphentheorie (Suche nach dem Durchmesser des Baumes)

Titellink: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1369

Thema

Ermitteln Sie bei einem Baum mit N Knoten den Abstand (den Durchmesser des Baums) zwischen den beiden am weitesten entfernten Punkten dieses Baums. Die Anzahl der Knoten im Baum reicht von 0- (N-1). Der Abstand zwischen allen benachbarten Knoten beträgt 1.

Ideen

Nehmen Sie zuerst einen zufälligen Punkt, um einen Baum für den Wurzelknoten zu erstellen, und führen Sie dfs aus. Ich habe 0 genommen, dann den tiefsten Knoten t genommen und dann t als Wurzel verwendet, um einen Baum zu erstellen und dfs auszuführen. Die maximale Tiefe ist der Durchmesser des Baumes.

AC-Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<int> v[105];
int ans, mx;
void dfs(int s, int fa, int dep){
    if(dep > ans){
        ans = dep;
        mx = s;
    }
    for(int i = 0; i < v[s].size(); i ++){
        int t = v[s][i];
        if(t == fa) continue;
        dfs(t, s, dep + 1);
    }
}
int main(){
    int n;
    while(~scanf("%d", &n)){
        for(int i = 0; i < n; i ++) v[i].clear();
        for(int i = 1; i < n; i ++){
            int x, y;
            scanf("%d%d", &x, &y);
            v[x].push_back(y);
            v[y].push_back(x);
        }
        ans = 0, mx = 0;
        dfs(0, -1, 0);
        ans = 0;
        dfs(mx, -1, 0);
        printf("%d\n", ans);
    }
    return 0;
}

 

Ich denke du magst

Origin blog.csdn.net/weixin_43911947/article/details/113404667
Empfohlen
Rangfolge