题意描述:

给你一颗带权无根树,共有2*n个节点,有n对人,然后每一个人被分配到一个节点上

问题1:怎么安排使得这n对人之间距离之和最小

问题2:怎么安排使得这n对人之间距离之和最大

题解:直接去想具体的方案根本无从下手,这里需要转换思维,我们去考虑每一条边对于答案的贡献,可以从下面这张图中找到答案,图来自官方题解

从图中可以看出,如果要最大化答案,那么我们会尽量的让点对不在同一个联通分量中,也就是尽量往两边走,可以证明这样一定是最优的

最小值把图左右两边换一下就好了

看了题解才会的,太巧妙了

#include<bits/stdc++.h>

#define forn(i, n) for (int i = 0 ; i < int(n) ; i++)
#define fore(i, s, t) for (int i = s ; i < (int)t ; i++)
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pf2(x,y) printf("%d %d\n",x,y)
#define pf(x) printf("%d\n",x)
#define each(x) for(auto it:x) cout<<it<<endl;
#define pi pair<int,int> using namespace std; char inline nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
} template <typename T>
bool rd(T& v){
static char ch;
while(ch!=EOF && !isdigit(ch)) ch=nc();
if(ch==EOF) return false;
for(v=0;isdigit(ch);ch=nc())
v=v*10+ch-'0';
return true;
} template <typename T>
void o(T p){
static int stk[70],tp;
if(p==0) {
putchar('0');return ;
}
if(p<0) {
p=-p;putchar('-');
}
while(p) stk[++tp]=p%10,p/=10;
while(tp) putchar(stk[tp--]+'0');
} typedef long long ll; const int maxn=2e5+5;
const int maxm=5e5+5;
const int inf=1e9; int n,m; int size[maxn]; int head[maxn],ver[maxm],nex[maxm],wi[maxm],tot; void inline AddEdge(int x,int y,int z){
ver[++tot]=y,nex[tot]=head[x],wi[tot]=z,head[x]=tot;
} ll mn=0,mx=0; void dfs(int x,int pa){
size[x]=1;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(y!=pa) {
dfs(y,x);
size[x]+=size[y];
mn+=1ll*wi[i]*(size[y]%2);
mx+=1ll*wi[i]*min(size[y],2*n-size[y]);
}
}
} void solve(){
tot=0;
cin>>n;
m=2*n-1;
for(int i=1;i<=2*n+1;i++)
head[i]=0;
for(int i=0;i<m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
AddEdge(x,y,z);
AddEdge(y,x,z);
}
mn=0,mx=0;
dfs(1,0);
printf("%lld %lld\n",mn,mx);
} int main(){
int t;
cin>>t;
while(t--)
solve();
}

  

cf1282c的更多相关文章

随机推荐

  1. python笔记21(面向对象课程三)

    今日内容 嵌套 特殊方法:__init__ type/isinstance/issubclass/super 异常处理 内容回顾 def login(): pass login() class Acc ...

  2. 利用视频解析网站免费观看各大平台VIP电影

    需求: 观看VIP电影.VIP电视 准备: 1.视频解析网站 2.VIP电影URL 教程开始: 1.百度搜索[视频解析],会索引出大量的视频解析网站,随便选择一个网站. 2.找到想观看的VIP视频,复 ...

  3. 关于C++ 中 thread 的拷贝构造函数

    起因来自于<C++并发编程实战>的这样一个例子 #include <thread> #include <iostream> #include <stdexce ...

  4. pytorch ---神经网络语言模型 NNLM 《A Neural Probabilistic Language Model》

    论文地址:http://www.iro.umontreal.ca/~vincentp/Publications/lm_jmlr.pdf 论文给出了NNLM的框架图: 针对论文,实现代码如下: # -* ...

  5. 开源堡垒机jumpserver的安装

    开源跳板机jumpserver安装 简介 Jumpserver 是全球首款完全开源的堡垒机, 使用GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统 Jumpserver 使用Pyt ...

  6. 动态获取bind dns日志IP脚本

    #!/usr/bin/env python #_*_coding:utf-8_*_ ''' python deny_dns_allip.py your_filelog_name 动态获取dns日志的I ...

  7. 再次小结windows服务的编写

    2013-03-23 21:05 (分类:计算机程序) 其实很简单 void mian() { //服务的分派表    SERVICE_TABLE_ENTRY DispatchTable[] ={   ...

  8. 珠峰-6-http和http-server原理

    ???? websock改天研究下然后用node去搞. websock的实现原理. ##### 第9天的笔记内容. ## Header 规范 ## Http 状态码 - 101 webscoket 双 ...

  9. 文本段落缩进text-indent:2em

    中文文字中的段前习惯空两个文字的空白,这个特殊的样式可以用下面代码来实现: p{text-indent:2em;} <p>1922年的春天,一个想要成名名叫尼克卡拉威(托比?马奎尔Tobe ...

  10. 3,HDFS原理

    1,HDFS体系结构 ··· HDFS是采用master/slaves即主从结构模型来管理数据的.这种模型主要由四部分组成,分别是Client.NameNode.DataNode.SecondaryN ...