uva 10308(无根树变有根)

题意:给出一些村庄之间的路的距离,每个村庄可以到达任意其他村庄,且所有路中不会有环。问任意两个村庄可达的总路径最长是多少。

题解:因为从一个村庄到另一个村庄同一个的村庄不会经过两次,所以村庄和路其实是一棵无根树,用dfs(int a)计算结点a的子结点到a的最大距离,结果就是a的子结点到结点a的最大距离加次大距离。


#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 10005;
char str[30];
int vis[ N];
int cnt, head[N], res;
struct Edge {
	int u, v, l, next;
}e[N];

int dfs(int cur) {
	int temp = 0;
	vis[cur] = 1;
	for (int i = head[cur]; i != -1; i = e[i].next) {
		if (!vis[e[i].v]) {
			int dd = dfs(e[i].v) + e[i].l;
			res = max(res, temp + dd);
			temp = max(temp, dd);
		}
	}
	return temp;
}

void add(int u, int v, int l) {
	e[cnt].u = u;
	e[cnt].v = v;
	e[cnt].l = l;
	e[cnt].next = head[u];	
	head[u] = cnt++;

	e[cnt].u = v;
	e[cnt].v = u;
	e[cnt].l = l;
	e[cnt].next = head[v];
	head[v] = cnt++;
}

int main() {
	while (1) {
		int a, b, c;
		memset(head, -1, sizeof(head));
		memset(vis, 0, sizeof(vis));
		res = 0;
		cnt = 0;
		while (gets(str) != NULL && str[0] != '\0') {
			sscanf(str, "%d%d%d", &a, &b, &c);
			add(a, b, c);
		}
		dfs(a);
		printf("%d\n", res);
		if (str[0] != '\0')
			break;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值