1737 配对

1737 配对

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

给出一棵n个点的树,将这n个点两两配对,求所有可行的方案中配对两点间的距离的总和最大为多少。

Input

一个数n(1<=n<=100,000,n保证为偶数) 接下来n-1行每行三个数x,y,z表示有一条长度为z的边连接x和y(0<=z<=1,000,000,000)

Output

一个数表示答案

Input示例

6

1 2 1

1 3 1

1 4 1

3 5 1

4 6 1

Output示例

7

//配对方案为(1,2)(3,4)(5,6)

//考虑边的贡献,等于 min(a,b) (a,b是边连接的两个连通块的大小),可以容易想到,这样的情况必然可以构造成功,而且是答案的下界,或者,由树的重心,分开的部分,是可以构成的。

  1 # include <cstdio>
  2 # include <cstring>
  3 # include <iostream>
  4 # include <algorithm>
  5 using namespace std;
  6 # define LL long long
  7 # define INF 0x3f3f3f3f
  8 # define MX 100005
  9 /**************************/
 10 # define BUF_SIZE 100000
 11 # define OUT_SIZE 100000
 12 bool IOerror=0;
 13
 14 inline char nc(){
 15     static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
 16     if (p1==pend){
 17         p1=buf; pend=buf+fread(buf,1,BUF_SIZE,stdin);
 18         if (pend==p1){IOerror=1;return -1;}
 19         //{printf("IO error!\n");system("pause");for (;;);exit(0);}
 20     }
 21     return *p1++;
 22 }
 23 inline bool blank(char ch){return ch==‘ ‘||ch==‘\n‘||ch==‘\r‘||ch==‘\t‘;}
 24 inline void read(int &x){
 25     bool sign=0; char ch=nc(); x=0;
 26     for (;blank(ch);ch=nc());
 27     if (IOerror)return;
 28     if (ch==‘-‘)sign=1,ch=nc();
 29     for (;ch>=‘0‘&&ch<=‘9‘;ch=nc())x=x*10+ch-‘0‘;
 30     if (sign)x=-x;
 31 }
 32
 33 void print(LL x){
 34     static char s[25],*s1;s1=s;
 35     if (!x)*s1++=‘0‘;if (x<0)putchar(‘-‘),x=-x;
 36     while(x)*s1++=x%10+‘0‘,x/=10;
 37     while(s1--!=s)putchar(*s1);
 38 }
 39
 40 struct Edge{
 41     int v,s;
 42     int nex;
 43 }edge[MX*2];
 44
 45 int n,rm;
 46 int son[MX];
 47 int hlist[MX];
 48 int ansdex,mans;
 49
 50 LL dis[MX];
 51
 52 void addedge(int u,int v,int s)
 53 {
 54     edge[rm]=(Edge){v,s,hlist[u]};
 55     hlist[u]=rm++;
 56 }
 57
 58 void dfs(int u,int pre)
 59 {
 60     int mmm=0;
 61     son[u]=1;
 62     for (int i=hlist[u];i!=-1;i=edge[i].nex)
 63     {
 64         int v = edge[i].v;
 65         if (v==pre) continue;
 66         dfs(v,u);
 67         son[u]+=son[v];
 68         mmm=max(mmm,son[v]);
 69     }
 70     mmm = max(mmm,n-son[u]);
 71     if (mmm<mans)
 72     {
 73         ansdex=u;
 74         mans = mmm;
 75     }
 76 }
 77
 78 void dfs2(int x,int pre,LL s)
 79 {
 80     dis[x]=s;
 81     for(int i=hlist[x];i!=-1;i=edge[i].nex)
 82     {
 83         int v = edge[i].v;
 84         if (v==pre) continue;
 85         dfs2(v,x,s+edge[i].s);
 86     }
 87 }
 88
 89 int main()
 90 {
 91     scanf("%d",&n);
 92     memset(hlist,-1,sizeof(hlist));
 93     rm=0; mans=INF;
 94     for (int i=1;i<n;i++)
 95     {
 96         int u,v,z;
 97         read(u),read(v),read(z);
 98         addedge(u,v,z);
 99         addedge(v,u,z);
100     }
101     dfs(1,-1);
102     dfs2(ansdex,-1,0);
103
104     LL tot = 0;
105     for (int i=1;i<=n;i++)
106         tot+=dis[i];
107     print(tot);
108     return 0;
109 }

时间: 2024-12-10 20:51:07

1737 配对的相关文章

51Nod 1737 配对(树的重心)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1737 题意: 思路: 树的重心. 树的重心就是其所以子树的最大的子树结点数最少,删除这个点后最大连通块的结点数最小,也就说各个连通块尽量平衡. 这道题的话就是先求一个重心,然后求各个点到重心的距离之和. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #inclu

51nod 配对(求树的重心)

传送门:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1737 给出一棵n个点的树,将这n个点两两配对,求所有可行的方案中配对两点间的距离的总和最大为多少. Input 一个数n(1<=n<=100,000,n保证为偶数) 接下来n-1行每行三个数x,y,z表示有一条长度为z的边连接x和y(0<=z<=1,000,000,000) Output 一个数表示答案 Input示例 6 1 2 1 1 3 1

南阳OJ-2 括号配对 (数据结构-栈的应用)

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

1485 字符配对

codevs——1485 字符配对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 在一个字符串中,把相同的字符两两删除,求剩下字符的个数. 例如:字符串asasda, 首先删除两个'a',得到字符串'ssda'. 然后删除两个's',得到字符串'da'. 此时,字符串中没有了相同的字符,删除结束,剩下个数为2. 输入描述 Input Description 一个字符串,含义如描述所示. 输出描述 Output Des

Bzoj1237 [SCOI2008]配对

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1446  Solved: 551 Description 你有n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一 个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配 对.例如A={5,6,8},B={5,7,8},则最优配对方案是5配8, 6配5, 8配7,配对整数 的差的绝对值分别为2, 2, 1,和为5.注意,5配5,6配7,8配8是不允许的,因 为

Android蓝牙自动配对Demo,亲测好使!!!

蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details/52400782 经过最近一段时间得研究,针对网上给出的案例.总结了一个亲测好使的Demo. 说明如下: 1.本Demo用来连接蓝牙设备HC-05,如果你要连接其他蓝牙设备,注意修改相关名字以及修改设备初试pin值. 2.将Demo安装在Android手机上,点击按钮,可以实现与目标蓝牙设备的自动

【 网络流24 】飞行员配对方案问题

第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的 2 名飞行员,其中 1 名是英国飞行员,另 1 名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员

SPSS数据分析—配对Logistic回归模型

Lofistic回归模型也可以用于配对资料,但是其分析方法和操作方法均与之前介绍的不同,具体表现 在以下几个方面1.每个配对组共有同一个回归参数,也就是说协变量在不同配对组中的作用相同2.常数项随着配对组变化而变化,反映了非实验因素在配对组中的作用,但是我们并不关心其大小, 因此在拟合时采用条件似然函数代替了一般似然函数,从而在拟合中消去了反映层因素的参数. SPSS中没有直接拟合配对Logistic回归模型的过程,需要对数据进行一些处理,采用其他方法进行拟合,拟合方法有变量差值拟合和COX模型

android 打开蓝牙设备 显示已经配对的蓝牙设备 ,并将已配对的蓝牙设备显示在textview中

(1)要想使用android 手机的Bluetooth,需要在androidmanifest文件中加入使用蓝牙的权限. <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 注意:权限应该添加在androidmanifest文件中&