200207题(美团)

200207题(美团)_第1张图片

#include
#include
#include
using namespace std;

int sum = 0;
const int N = 100000;
vector<int> v[N];
//思路: 其实就是每条边都会走两遍,一共有n - 1条边,所以2*(n - 1), 最后一条路径只需要走一次,所以减去最后一条路径的长度。
//本质来说,就是求一个图的最长路径

void DFS(int x, int pre, int cur_sum) {
	for (int i = 0; i < v[x].size(); i++) {
		if (v[x][i] != pre)
			DFS(v[x][i], x, cur_sum + 1);
	}
	sum = max(sum, cur_sum);
}

int main() {
	int n, x, y;
	cin >> n;
	for (int i = 1; i <= n - 1; i++) {
		cin >> x >> y;//x与y结点相连
		v[x].push_back(y);
		v[y].push_back(x);
	}
	DFS(1, -1, 0);
	cout << 2 * (n - 1) - sum << endl;
	return 0;
}

你可能感兴趣的:(DFS)