uva10308(树)

来源:互联网 发布:linux查看nvidia显卡 编辑:程序博客网 时间:2024/06/05 22:23

题意:

有几个城镇,要建路,不能存在环,问距离最远的两个城镇,距离多远;

给出的一系列边(u到v)以及距离,空行代表一组样例结束;


思路:

这就是一棵无根树,我们可以以任意节点做根(我用1,因为每组样例肯定都有1);

然后就是从根开始算,以这个节点为中转,最大的值肯定是他最长的两个儿子的和;

我们只要每次都算当前节点最长的两个儿子的和,再更新最终结果,然后把最长的儿子返回给它的父亲;


AC代码:


#include<cstdio>#include<cstring>#include<algorithm>#define ll long longusing namespace std;const int N = 20005;char str[50];int l,r,d,root,e;int nex[N];ll res;int u[N];int v[N];int first[N];int len[N];ll dfs(int cur , int p) {int l,r;ll m = 0 ;for(int i = first[cur] ; i != -1 ; i = nex[i]) {int x = v[i];if(x != p) {ll ans = dfs(x , cur) + len[i];if(m + ans > res) {res = m + ans;}m = max(m, ans);}}return m;}void add(int l , int r ,int d) {u[e] = l;v[e] = r;nex[e] = first[u[e]];first[u[e]] = e;len[e] = d;e++;u[e] = r;v[e] = l;nex[e] = first[u[e]];first[u[e]] = e;len[e] = d;e++;}int main () {while(1) {res = 0;memset(nex , -1 , sizeof(nex));memset(first , -1 , sizeof(first));e = 0;while(gets(str) != NULL && str[0] != '\0') {sscanf(str , "%d%d%d" , &l, &r, &d);add(l ,r , d);}dfs(1 , -1);printf("%lld\n",res);if(str[0] != '\0')break;}}


0 0
原创粉丝点击