cf1282c
题意描述:
给你一颗带权无根树,共有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的更多相关文章
随机推荐
- 【基础】CodeBlocks调试器基本使用方法
CodeBlocks是一个开放源码的全功能的跨平台C/C++集成开发环境. 下载地址:http://www.codeblocks.org/downloads/26 其中,Windows环境下可以使用 ...
- PyObject and PyTypeObject - Python 中的 '对象' 们
1 PyObject, PyTypeObject - Python 中的 '对象' 们 '一切皆对象' - 这是 Python 的学习和使用者们最最常听到一句, 可谓 博大精深 - '勃大精深'. ' ...
- 手把手带你阅读Mybatis源码(二)执行篇
前言 上一篇文章提到了MyBatis是如何构建配置类的,也说了MyBatis在运行过程中主要分为两个阶段,第一是构建,第二就是执行,所以这篇文章会带大家来了解一下MyBatis是如何从构建完毕,到执行 ...
- 浅谈CC攻击原理与防范
概念 CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃.CC主要是用来攻击页面的,每个人都有这样的体验:当一个网页访问的人数特别多的 ...
- RFC笔记—IP Version 6 Addressing Architecture
IP Version 6 Addressing Architecture,RFC4291 It includes the basic formats for the various types of ...
- k8s系列---EFK日志系统
文章拷于:http://blog.itpub.net/28916011/viewspace-2216748/ 用于自己备份记录错误 一个完整的k8s集群,应该包含如下六大部分:kube-dns.i ...
- Shell脚本 server rsync 控制脚本
[root@backup ~]# vim /etc/init.d/rsync#!/bin/bash #this script for start|stop rsync daemon service s ...
- Bookshelf 2 01背包
B - Bookshelf 2 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submi ...
- 大数四则运算之加法运算--------C语言版(未考虑负数)
/* 声明两个字符数组,用于存储大数,声明两个整数型数组便于计算,将字符数组中的元素转换为对应整数存于整数数组中,将低位放在整数数组低位,便于对齐计算 判断是否有进位,计算结果高位先输出,从数组后往前 ...
- C语言基础二 练习
指出正确标识符 命名 l 只能由26个英文字母的大小写.10个阿拉伯数字0~9.下划线_组成 l 严格区分大小写,比如test和Test是2个不同的标识符 l 不能以数字开头 l 不可以使用关键字作为 ...