好久没有发题解了,有没有人想我呀~(其实没有
主要是最近开学啦,我变成大二啦,校园里来了好多学弟学妹,各种课程和活动一下子就把日程给塞满了,弄得我都没有大块的专门的时间写题,现在在数据结构的课上摸鱼~
不废话了,这个题关键点就是储存一下father的点,再记录一下深度和宽度就可以了~上代码:
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#define modulo 100
const int MAXN = 105;
using namespace std;
struct node {
int f, d;
}tree[MAXN];
int depth, length, n, u, v, disu, disv;
int l[MAXN];
void finddis(int u, int v) {
//printf("u is %d, v is %d\n", u, v);
if (u == v) {
cout << disu * 2 + disv << endl;
return ;
}
if (tree[u].d == tree[v].d) {
v = tree[v].f;
u = tree[u].f;
disu++;
disv++;
}
else if (tree[u].d < tree[v].d) {
v = tree[v].f;
disv++;
}
else {
disu++;
u = tree[u].f;
}
//printf("disu is %d, disv is %d\n", disu, disv);
finddis(u, v);
return ;
}
void printdepth() {
for (int i = 1; i <= n; i++) {
printf("for node %d, its depth is %d\n", i, tree[i].d);
}
}
int main() {
int temf, tem;
tree[1].d = 1;
cin >> n;
for (int i = 1; i < n; i ++) {
cin >> temf >> tem;
tree[tem].f = temf;
tree[tem].d = tree[temf].d + 1;
depth = max(depth, tree[tem].d);
l[tree[tem].d] ++;
length = max(length, l[tree[tem].d]);
}
cout << depth << "\n" << length << endl;
cin >> u >> v;
finddis(u, v);
//printdepth();
return 0;
}