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
- uva10308(树)
- UVA10308
- uva10308 - Roads in the North 树形DP
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 树
- 利用python的csv库处理csv文件
- java restful 后端 Exception 的处理架构总结
- 最好用Unity3D按住鼠标键才转动摄像机的方法
- numpy 中 + 和 += 的区别
- 提示:ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
- uva10308(树)
- clustring testing -- robin canopy
- TaskAffinity
- python 格式化输出
- 创建本地网络服务名配置
- uva 10308(无根树变有根)
- ios工程中使用sqlite3方法
- css文件中引入CSS文件、js文件中引入js文件
- char*str 和 char str[]的分别