题目地址:202.197.224.59/OnlineJudge2/

来自湘潭大学OJ,题号:1267。

这里用到了一个树的直径(树中的最长边)的结论:当你找到一棵树的最长边后,这个树中所有点的最长边必定和这条边的两个端点相连。下面给出证明:

设这条最长边的两个端点分别为B和E;

1.当选择的任意点M在这条最长边上时:如果此时还存在另一个点T,使得MT > max{MB,ME}。则:MT + min{MB,ME} > max{MB,ME} + min{MB,ME} = BE这与题目假设相矛盾。

2.当选择的任意点M不在这条最长边上时:

Α.与它相连的最长边与BE有交点时,假设交于X,则:M的最长边 = MX + X的最长边,而X在BE上,所以M的最长边 = MX + max{XB,XE}即它的最长边终止于BE中的一个点。

B.若无交点,假设M的最长边为MN,则:取BE上一点X,连接MX,有:MN > max{XB,XE} + XM,MN + MX + max{XB,XE} > 2MX + 2max{XB,XE} > BE与题设矛盾

由此,本题思路即为:先找到最长边,然后将其余的n - 2个点到最长边两个端点的距离算出,不断地挑选这n-2个点到两个端点的更长的那个路径,最后加上这条最长路就是所求结果。

下面的代码用C++11提交能过,而用G++则会WA

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define maxn 100005
#define F 0x3f
using namespace std;
struct edge
{
int len,over;
edge(int a = ,int b = )
{
len = a,over = b;
}
};
long long dist[][maxn];
vector<edge> graph[maxn];
inline void init()
{
for(int i = ;i < maxn;++i)
graph[i].clear();
}
queue<int> q;
void bfs(int use,int start)
{
while(q.size()) q.pop();
q.push(start);
dist[use][start] = ;
while(q.size()){
int temp = q.front();
q.pop();
for(int i = ;i < graph[temp].size();++i){
int length = graph[temp][i].len,nextone = graph[temp][i].over;
if(dist[use][nextone] == -){
dist[use][nextone] = dist[use][temp] + length;
q.push(nextone);
}
}
}
return;
}
int main()
{
int n;
while(scanf("%d",&n) == ){
int start,over,len;
init();
for(int i = ;i < n - ;++i){
scanf("%d%d%d",&start,&over,&len);
graph[start].push_back(edge(len,over));
graph[over].push_back(edge(len,start));
}
int point1,point2;
memset(dist,-,sizeof(dist));
//printf("now dist is %lld\n",dist[0][0]);
bfs(,);
long long maxone = ;
for(int i = ;i <= n;++i){
if(dist[][i] > maxone) maxone = dist[][i],point1 = i;
}
maxone = ;
bfs(,point1);
for(int i = ;i <= n;++i){
if(dist[][i] > maxone) maxone = dist[][i],point2 = i;
}
bfs(,point2);
//printf("point1 is %d and point2 is %d\n",point1,point2);
long long answer = ;
answer += dist[][point2];
for(int i = ;i <= n;++i){
if(i != point1 && i != point2){
answer += max(dist[][i],dist[][i]);
}
}
if(n == ) answer = ;
printf("%lld\n",answer);
}
return ;
}

2017CCPC中南地区赛 H题(最长路)的更多相关文章

  1. 2013年省赛H题

    2013年省赛H题你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4.想法真的是非常巧妙啊N=100000构造两个数组,f1[N],间隔为Af2[1e4]间隔为A^N,中 ...

  2. Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题(拓扑序求有向图最长路)

    参考博客(感谢博主):http://blog.csdn.net/yo_bc/article/details/77917288 题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所 ...

  3. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  4. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  5. HDUOJ-------2493Timer(数学 2008北京现场赛H题)

    Timer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. Sdut 2409 The Best Seat in ACM Contest(山东省第三届ACM省赛 H 题)(模拟)

    题目描述 Cainiao is a university student who loves ACM contest very much. It is a festival for him once ...

  7. PKU2018校赛 H题 Safe Upper Bound

    http://poj.openjudge.cn/practice/C18H 题目 算平均数用到公式\[\bar{x}=\frac{x_1+x_2+x_3+\cdots+x_n}{n}\] 但如果用in ...

  8. Rectangles(第七届ACM省赛原题+最长上升子序列)

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1255 描述 Given N (4 <= N <= 100)  rec ...

  9. ACM-ICPC 2018青岛网络赛-H题 Traveling on the Axis

    题目:略(不知道怎么从ZOJ搬题) 地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4054 把这题的每个点分成两种情况 ...

随机推荐

  1. IE6.0升级的两种通用代码

    随着W3C组织开始针对新的Web标准提案日期的到来,HTML5以及CSS3的新时代即将到来,同时微软的Win8以及IE10的出现也带给了这个世界奇妙的结构. 微软早在不再给WinXP做技术支持时,IE ...

  2. Natas Wargame Level 9 Writeup(bash injection)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArAAAAClCAYAAACkwM63AAAABHNCSVQICAgIfAhkiAAAIABJREFUeF

  3. Windows 自动获取IP脚本

    @echo off echo 正在自动获取IP地址.... set 连接名称=以太网 netsh interface ip set address name = "%连接名称%" ...

  4. WinForm笔记

    Hi All, 分享一个学WinForm时的笔记: 1. 关键字 partial:是部分类,允许将一个类放在多个文件当中. 2. MessageBox()类相当于Console.WriteLine() ...

  5. Building Particle Filters and Particle MCMC in NIMBLE

    This example shows how to construct and conduct inference on a state space model using particle filt ...

  6. 【Netty】UDP广播事件

    一.前言 前面学习了WebSocket协议,并且通过示例讲解了WebSocket的具体使用,接着学习如何使用无连接的UDP来广播事件. 二.UDP广播事件 2.1 UDP基础 面向连接的TCP协议管理 ...

  7. Swoole笔记(一)

    简介 Swoole是一个PHP扩展,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读 ...

  8. 全景智慧城市常诚——一个实体商家“自剖”VR全景的势在必得

    谈起"智慧城市",你的心中是否充满了期待?随着互联网的发展,人们对于"智慧城市"的需求越来越迫切.现在想想,我也算是首批入驻全景智慧城市的商家之一了.在各种连锁 ...

  9. 玩转nodeJS系列:使用原生API实现简单灵活高效的路由功能(支持nodeJs单机集群),nodeJS本就应该这样轻快

    前言: 使用nodeJS原生API实现快速灵活路由,方便与其他库/框架进行整合: 1.原生API,简洁高效的轻度封装,加速路由解析,nodeJS本就应该这样轻快 2.不包含任何第三方库/框架,可以灵活 ...

  10. JavaScript严格模式有什么不同

    看ES6,瞄到“严格模式”,问了下自己什么是“严格模式”?答案好像不是很明朗,遂总结如下: 严格模式声明:“use strict”; 1.禁止变量未声明就赋值 2.限制动态绑定(属性和方法归属哪个对象 ...