最开始是1 9 10 出错,那时候考虑了两个点在根结点两边的情况,后面发现不对,我就想着把到根节点的最小路径打印下来,把到目标点的最小路径打印下来,相同的地方加2不同的地方加1 但是还是ac不了,想不出来哪里错了,求大佬讲解一下
#include <iostream>
#include <cstring>
using namespace std;
const int N = 11000;
int h[N], e[N], ne[N], idx;
int layer[N], numlayer[N];
void connect(int st, int fi)
{
ne[idx] = h[st];
e[idx] = fi;
h[st] = idx++;
}
int q[N], last, front;
bool used[N];
//求距离
int out[N];
int out1[N], outfi[N];
void dfs(int p, int l, int fi)
{
if (p == 1)
{
memcpy(out1, out, sizeof out);
}
if (p == fi)
{
memcpy(outfi, out, sizeof out);
}
for (int i = h[p]; i != -1; i = ne[i])
{
int next = e[i];
if (!used[next])
{
used[next] = true;
out[l] = next;
dfs(next, l + 1, fi);
}
}
}
int main()
{
memset(h, -1, sizeof h);
int n;
cin >> n;
for (int i = 1; i < n; i++)
{
int st, fi;
cin >> st >> fi;
connect(st, fi);
connect(fi, st);
}
q[front++] = 1;
layer[1] = 1, numlayer[1] = 1, used[1] = true;
int mxlayer = 0;
while (last < front)
{
int now = q[last++];
for (int i = h[now]; i != -1; i = ne[i])
{
int next = e[i];
if (!used[next]) {
used[next] = true;
layer[next] = layer[now] + 1;
mxlayer = max(mxlayer, layer[next]);
numlayer[layer[next]]++;
q[front++] = next;
}
}
}
cout << mxlayer << endl; //最大深度
int mxw = 0;
for (int i = 1; i <= mxlayer; i++)
mxw = max(mxw, numlayer[i]);
cout << mxw << endl; //最大宽度
int st, fi;
cin >> st >> fi;
front = 0; last = 0;
memset(used, 0, sizeof used);
out[0] = st;
dfs(st, 1, fi);
int dis = 0;
for (int i = 1; outfi[i] != 0; i++)
{
if (out1[i] == outfi[i])
dis += 2;
else dis += 1;
}
cout << dis << endl;
return 0;
}