XTOJ 1267:Highway(树的直径)***

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1267

题意:给出一棵树,每条树边有权值,现在要修建n-1条边,边的权值为边的两点间原来的树边权值之和,问最大能是多少。

思路:背锅题。比赛的时候想过树的直径,可是想歪了。后面队友想到的解法是对每个叶子和每个结点连边,结果MLE了。

没有想到:把树的直径确定之后,对于每一个点,能跑到的最远距离就是到两个端点的较远的点的距离。

因此可以先dfs跑到一个端点,再dfs跑到另一个端点(顺便处理出第一个距离数组),再dfs从一个另一个端点跑回去(处理出第二个距离数组)。

因为最大的长度只能算一次(n-1条边),因此要减去一次。

要I64d(比赛的时候可以lld,现在却不行)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 #define N 100010
 5 struct Edge {
 6     int v, nxt; LL w;
 7     Edge () {}
 8     Edge (int v, int nxt, LL w) : v(v), nxt(nxt), w(w) {}
 9 } edge[N*2];
10 int head[N], tot, n, p;
11 LL dis[2][N], big;
12
13 void Add(int u, int v, LL w) {
14     edge[tot] = Edge(v, head[u], w); head[u] = tot++;
15     edge[tot] = Edge(u, head[v], w); head[v] = tot++;
16 }
17
18 void dfs(int u, int fa, int k) {
19     if(dis[k][u] > big) p = u, big = dis[k][u];
20     for(int i = head[u]; ~i; i = edge[i].nxt) {
21         int v = edge[i].v; if(v == fa) continue;
22         dis[k][v] = edge[i].w + dis[k][u];
23         dfs(v, u, k);
24     }
25 }
26
27 int main() {
28     while(~scanf("%d", &n)) {
29         memset(head, -1, sizeof(head)); tot = 0;
30         for(int i = 1; i < n; i++) {
31             int u, v; LL w; scanf("%d%d%I64d", &u, &v, &w);
32             Add(u, v, w);
33         }
34         dis[0][1] = 0, big = 0;
35         dfs(1, -1, 0); // 从1找某个端点
36         int l = p;
37
38         dis[0][l] = 0, big = 0;
39         dfs(l, -1, 0); // 从一个端点找另一个端点更新dis1
40         int r = p;
41
42         dis[1][r] = 0;
43         dfs(r, -1, 1); // 从另一个端点找回去更新dis2
44
45         LL ans = 0, now, res = 0;
46         for(int i = 1; i <= n; i++)
47             ans += max(dis[0][i], dis[1][i]);
48         printf("%I64d\n", ans - dis[0][r]);
49     }
50     return 0;
51 }
时间: 2024-10-01 00:29:29

XTOJ 1267:Highway(树的直径)***的相关文章

(树的直径)第九届湘潭市大学生程序设计比赛 H-Highway

Highway Accepted : 25   Submit : 104 Time Limit : 4000 MS   Memory Limit : 65536 KB  Highway In ICPCCamp there were n towns conveniently numbered with 1,2,-,n connected with (n?1) roads. The i-th road connecting towns ai and bi has length ci. It is g

2017湘潭大学邀请赛H题(树的直径)

链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE H. Highway The input contains zero or more test cases and is terminated by end-of-file. For each test case: The first line contains an integer n. The i-th of the following (n ? 1) lines contains three

poj 1985 Cow Marathon 【树的直径】

题目:poj 1985 Cow Marathon 题意:给出一个树,让你求树的直径. 分析: 树的直径:树上两点之间的最大距离. 我们从任意一点出发,BFS一个最远距离,然后从这个点出发,在BFS一个最远距离,就是树的直径. AC代码: /* POJ:1985 Cow Marathon 2014/10/12/21:18 Yougth*/ #include <cstdio> #include <iostream> #include <algorithm> #include

poj1849(求树的直径)

题目链接:http://poj.org/problem?id=1849 题意:有一颗n个结点的带权的无向树, 在s结点放两个机器人, 这两个机器人会把树的每条边都走一遍, 但是最后机器人不要求回到出发点. 问你两个机器人走的路总长之和的最小值是多少? 分析:如果从某点出发遍历完一棵树再回来,那么所有边都会走两遍,而从某点有两个机器人出发去遍历,因为不用回来,所以最后那两个人距离越远越好,可以从树的直径上某个点背道而驰,那么这段距离(树的直径)只走了一遍,其他的要走两遍,所以ans=sum*2-l

SDUT OJ 3045 迷之图论 (树的直径)

题目地址:SDUT OJ 3045 这题比赛的时候想的差不多..但是总是觉得不对..写了一次就没再写,然后删了..当时没想到的是第二次求出来的就是最长链..当时想到的两次bfs找最大值(这一种方法其实结果也对..TAT..),还有找到点后在回溯减去重点等等..但总觉得好像都不太对...赛后才知道这题原来是树的直径.....牡丹江区域现场赛的时候遇到过,不过赛后也没看... 找树的直径的方法其实就是先任取一点进行bfs,找到最远的一点,这时最远的一点肯定是最长链端点之一,然后再从这一最远点开始bf

hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径

题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v(level最深)该点必然是树的直径的一个端点,,再从该点出发,bfs,到最深的一点,该点深度就是直径.(证明:先假设u,是直径上一点,S,T是直径的端点,设v!=t,则有(V,U)+(U,S)>(T,U)+(U,S),矛盾,故t=v:若u不是直径上一点,设u到直径上的一点为x,同理易证. 最后 缩

ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】

题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题意:给出n个点,n-1条边的一棵树.然后要在两个点上建立两个消防站.让全部点的到消防站最大距离的点的这个距离最小. 分析:首先先求这个树的直径.然后在树的直径的中点处把树分成两棵树.然后在把两棵树分别取中点的最大值就是ans值. 这个题目数据有点水了感觉... AC代码: #include <cstdi

BDFZOI 树的直径

提交次数:2 涉及知识:基础图论/BFS 描述 一棵树T的"直径"定义为结点两两间距离的最大值.给定带权树T,求T的直径长度. 输入 第一行包含2个整数N.M,表示图中共有N个结点和M条无向边.(N <= 5000,M<n)接下来M行,每行包含3个整数{u,v,w},表示有一条无向边连接结点u.v*输入保证是无环图输出一个整数,代表直径长度 样例输入 4 31 2 12 3 22 4 3 样例输出 5 代码: 1 #include<iostream> 2 #in

codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” consists of n servers and m two-way communication links. Two servers can communicate either through a direct link, or through a chain of links, by relayi