2018牛客多校第六场 G.Pikachu
题意:
给出一棵n个点的树,每条边有边权。对这个树加边变成一个完全图。新加的边的权值为边上两点在树上的距离。求完全图上任意两点的最大流之和。
题解:
一共有C(n,2)个点对。假设当前求s到t之间的最大流,也就是最小割。那么割完之后会是2个连通块,且连通块内部是完全图。
因为是最小割,所以被割掉的边权和最小。即两个连通块内部的边权和最大。那么就会有一个连通块是孤立点,取s和t中到其余所有点距离小的作为孤立点。
问题变成了求每个点到其他所有点的距离。
dfs第一次求每个点到他所有儿子节点的距离,dfs第二次将剩余的距离更新。
最后排序统计答案。答案会爆ll所以要用类似大数的方法处理一下。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+;
const ll inf = 1e17;
int t, n, tot, cnt;
int u, v;
int num[N];
int head[N], to[N<<], nxt[N<<], w[N<<];
ll ans;
ll d[N];
void dfs(int u, int fa) {
num[u] = ;
d[u] = ;
for(int i = head[u]; ~i; i = nxt[i]) {
int v = to[i];
if(v == fa) continue;
dfs(v, u);
num[u] += num[v];
d[u] += d[v]+num[v]*w[i];
}
}
void re_dfs(int u, int fa) {
for(int i = head[u]; ~i; i = nxt[i]) {
int v = to[i];
if(v == fa) continue;
d[v] = d[u]+(n-*num[v])*w[i];
re_dfs(v, u);
}
}
int main() {
scanf("%d", &t);
for(int casee = ; casee <= t; casee++) {
scanf("%d", &n);
tot = ans = cnt = ;
memset(head, -, sizeof(int)*(n+));
for(int i = ; i < n; i++) {
scanf("%d%d", &u, &v);
to[++tot] = v; nxt[tot] = head[u]; head[u] = tot; scanf("%d", &w[tot]);
to[++tot] = u; nxt[tot] = head[v]; head[v] = tot; w[tot] = w[tot-];
}
dfs(, );
re_dfs(, );
sort(d+, d+n+);
for(int i = ; i <= n; i++) {
ans += d[i]*(n-i);
cnt += ans/inf;
ans %= inf;
}
if(cnt) printf("Case #%d: %d%017lld\n", casee, cnt, ans);
else printf("Case #%d: %lld\n", casee, ans);
}
}
2018牛客多校第六场 G.Pikachu的更多相关文章
- 2018牛客多校第六场 I.Team Rocket
题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector ...
- 牛客多校第六场 G Is Today Friday? 蔡勒公式/排列
题意: 有一堆日期,这些日期都是星期五,但是数字被映射成了字母A~J,现在让你求逆映射,如果存在多种答案,输出字典序最小的那个. 题解: 用蔡勒公式解决关于星期几的问题. 对于映射,可以用笔者刚刚学会 ...
- 牛客多校第六场G Is Today Friday?(吉姆拉尔森/蔡勒公式 + 思维)题解
题意: 给你\(A-J\)的字母组成的日期,形式为\(yyyy/mm/dd\).现给你\(n\)个这样的串\((n<=1e5)\),问你把字母映射成数字,并且使得所有日期合法且为星期五的最小字典 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板
链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...
- 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)
链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...
- 牛客多校第六场-H-Pair
链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...
- 牛客多校第四场 G Maximum Mode
链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...
- 同构图+思维构造——牛客多校第六场E
考的其实是同构图的性质: 1.同构图的顶点数,边数相等 2.同构图通过点的映射后邻接矩阵相同 这篇博客讲的很好https://www.jianshu.com/p/c33b5d1b4cd9 本题还需要一 ...
随机推荐
- CC2640 LaunchPad入门试用-第一篇
1. 先安装固件ble_cc26xx_setupwin32_2_01_00_44423.exe. 2. 打开IAR先找到一个例程测试一下D:\ti\simplelink\ble_cc26xx_2_01 ...
- MySQL高级-showProfile
一.Show Profile是什么? 是MySql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优的测量. 默认情况下,参数处于关闭状态,并保存最近15次的运行结果. 二.分析步 ...
- hdu1159Common Subsequence(动态规划)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- Selenium(Python) ddt读取MySQL数据驱动
import unittestfrom time import sleep from ddt import ddt, datafrom pymysql import connectfrom selen ...
- lesson 15 Fifty pence worth of trouble
lesson 15 Fifty pence worth of trouble appreciate =be grateful for We really appreciate all the help ...
- hdu刷题2
hdu1021 给n,看费波纳列数能否被3整除 算是找规律吧,以后碰到这种题就打打表找找规律吧 #include <stdio.h> int main(void) { int n; whi ...
- 如何在线测试Exchange的速度
最新碰到了客户需要比较国内版和国际版的Office365的速度问题,微软提供在线工具测试 这里以Exchange 测试为例子,请参考. PS Onenote贴过来只能至图片,各位看官只能将就了 这里有
- Python3 Tkinter-Checkbutton
1.多选按钮创建 from tkinter import * root=Tk() Checkbutton(root,text='python').pack() root.mainloop() 2.绑定 ...
- js经典试题之常用的方法
js经典试题之常用的方法 1.下面代码输出的值 let s = "bob" const replaced = s.replace('b', 'l') replaced === &q ...
- “Hello World!团队”Alpha发布—视频链接+文案+美工
视频链接:http://v.youku.com/v_show/id_XMzEyNjc2MTAyOA==.html?sharefrom=iphone&sharekey=5378037f8b710 ...