蓝桥杯 PREV-9 大臣的旅费(求树直径)

题目链接:

PREV-9 大臣的旅费

思路:

根据题意,该国路线图是一颗树,则题意是求此树的直径;
用两次dfs/bfs即可求得一棵树的直径;

代码:

#include<bits/stdc++.h>

using namespace std;

struct edge { int to, cost; };
vector<vector<edge> > G;
vector<bool> vst;
int n;
int ans, dis;
void dfs(int u, int d) {
	vst[u] = true;
	if(d > dis) ans = u, dis = d;
	for(int i = 0; i < G[u].size(); i++) {
		int son = G[u][i].to;
		if(!vst[son]) dfs(son, G[u][i].cost + d);
	}
	vst[u] = false;
}
int find(int u) { ans = dis = 0; dfs(u, 0); return ans; }

int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);
#endif
	scanf("%d", &n);
	G.resize(n + 5), vst.resize(n + 5);
	for(int i = 1; i < n; i++) {
		int p, q, d;
		scanf("%d %d %d", &p, &q, &d);
		G[p].push_back(edge{q, d});
		G[q].push_back(edge{p, d});
	}
	int x = find(1), y = find(x);
	printf("%d", dis * (dis + 1) / 2 + 10 * dis); 
	return 0;	
}
发布了356 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_45228537/article/details/104330229
今日推荐