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的更多相关文章
随机推荐
- 15-cookie技术和session技术的联系和区别
1. 联系: *session实现依赖于Cookie 2. session问题: * 由服务器创建,存储在服务器 * 当浏览器关闭时,服务器不关闭,再次打开浏览器时, 默认获得的不是同一个sessi ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--网页版本代码生成器
1.单列表模式 2.树形列表模式 3.左右列表模式 4.左右树形和列表结合模式 一 简介 网页版代码生成器需要运行项目,非常有趣,可以用来研究,和自定义一些自己的代码习惯 按界面生成:可生成单个页面和 ...
- ubuntu下怎么配置/查看串口-minicom工具
一.安装minicom工具: 可直接使用命令sudo apt-get install minicom来完成安装 上面的截图因为检测到我已经安装过了. 二.通过minicom工具配置串口: 1.启动mi ...
- getElementsByName和getElementById获取控件
js对控件的操作通常使用getElementsByName或getElementById来获取不同的控件进行操作 getElementsByName() 得到的是一个array, 不能直接设value ...
- 来简单说说var,let,const,function,import,class
一.var和let var已经在JavaScript中存在很长一段时间了,但是它存在了一些不足的地方,接下来我们就来看看吧 首先var存在变量提升,这是怎么一回事呢,我们看下面代码 为什么是它呢,是因 ...
- 股票数据获取到了,导入MT4中,是否可以做出很好的量化交易策略呢?
寻找了很久,看到有tushare这个python的类库,但研究了几个小时都没有研究明白,anaconda安装和pycharm的使用都不是特别顺手,最后也是失败告终.还有就是我的低配的平板suerfac ...
- kthrotlds(WatchDogs变种)查杀方法
病毒现象 服务器出现卡顿.CPU飙升 以下为WatchDogs的判断方式及其命令:存在恶意进程watchdogs: ps -ef | grep watchdogs存在恶意进程ksoftirqds: p ...
- gcd手写代码及STL中的使用方法
一.手写代码 inline int gcd(int x,int y){ if(y==0) return x; else return(gcd(y,x%y)); } 二.STL中的使用方法 注:在STL ...
- c# 异步编程 使用回调函数例子
环境VS2010, 在项目属性中输出类型选择控制台应用程序 运行结果 using System;using System.Collections.Generic;using System.Compon ...
- RestTemplate + okhttp 实现远程调用
1. 添加依赖 <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency ...