3458出错
查看原帖
3458出错
1107543
yezhufenglv楼主2024/7/17 15:28

最开始是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;
}
2024/7/17 15:28
加载中...