The 2019 ICPC Asia Shanghai Regional Contest H Tree Partition k、Color Graph
H题意:
给你一个n个节点n-1条无向边构成的树,每一个节点有一个权值wi,你需要把这棵树划分成k个子树,每一个子树的权值是这棵子树上所有节点权值之和。
你要输出这k棵子树的权值中那个最大的。你需要让输出的结果尽可能小
题解:
二分结果,重要的是判断这个二分的值是否满足题目要求
对于划分子树的选择,就选择子树中权值最大且又满足二分的答案的那个子树
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const long long Max = 1e14 + 10;
int n, k, cnt, flag, head[maxn], num;
ll w[maxn], sum[maxn];
struct Edge
{
int v, nex;
} e[maxn << 2];
void add_edge(int x, int y)
{
e[cnt].v = y;
e[cnt].nex = head[x];
head[x] = cnt++;
}
void dfs(int x, int fa, ll limit)
{
sum[x] = w[x];
for (int i = head[x]; ~i; i = e[i].nex)
{
if (!flag)
return;
int v = e[i].v;
if (v != fa)
{
dfs(v, x, limit);
sum[x] += sum[v];
}
}
if (!flag)
return;
if (sum[x] > limit)
{
vector<ll> vec;
for (int i = head[x]; ~i; i = e[i].nex)
{
int v = e[i].v;
if (v != fa)
vec.push_back(sum[v]);
}
sort(vec.begin(), vec.end());
//int len=vec.size();
while (sum[x] > limit)
{
// sum[x]-=vec[len-1];
// num++;
// vec.pop_back();
// len--;
sum[x] -= vec.back();
vec.pop_back();
num++;
}
vec.clear();
}
if (num > k - 1) //因为我们没有把vec清空,所以最后还需要num数量还需要加1
{
flag = 0;
return;
}
}
bool check(ll x)
{
flag = 1;
num = 0;
dfs(1, 0, x);
if (flag)
return 1;
else
return 0;
}
int main()
{
int t, p = 0;
scanf("%d", &t);
while (t--)
{
cnt = 0;
memset(head, -1, sizeof(head));
memset(sum, 0, sizeof(sum));
scanf("%d%d", &n, &k);
for (int i = 1; i < n; ++i)
{
int x, y;
scanf("%d%d", &x, &y);
add_edge(x, y);
add_edge(y, x);
}
ll l = 1, r = Max, mid, ans;
for (int i = 1; i <= n; ++i)
{
scanf("%lld", &w[i]);
l = max(l, w[i]);
}
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid))
{
r = mid - 1;
ans = mid;
}
else
{
l = mid + 1;
}
}
printf("Case #%d: %lld\n", ++p, ans);
}
return 0;
}
K题意:
给你一个由n个节点m条边构成的一个无向图。保证不会出现重边和自环。你需要给边染色,你需要保证给一些边染色之后,图里面不会出现一个奇数环且这个环的所有边都被染色了。问你最多能给多少边染色。
题解:
就是二分图的一个性质。
你把这n个点分成两个集合(这一点暴力枚举就可以了,毕竟n<=16),然后如果一条边的两个端点在一个集合就不给它染色,否则就染色
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 10 + 10;
const int INF = 0x3f3f3f3f;
struct shudui
{
int x, y;
} e[1000];
int main()
{
int t, p = 0;
scanf("%d", &t);
while (t--)
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i)
{
int x, y;
scanf("%d%d", &x, &y);
x -= 1;
y -= 1;
e[i].x = x;
e[i].y = y;
}
int sum = 0;
for (int i = 1; i < (1 << n); ++i)
//for (int i = 7; i <= 7; ++i)
{
int res = 0;
for (int j = 1; j <= m; ++j)
{
int x = e[j].x;
int y = e[j].y;
//printf("%d %d %d %d\n", x, y, ((1 << x) & i), ((1 << y) & i));
if ((((1 << x) & i) > 0 && ((1 << y) & i) == 0) || (((1 << x) & i) == 0 && ((1 << y) & i) > 0))
{
res++;
}
}
// if (res == 5)
// {
// printf("%d***\n", i);
// }
sum = max(sum, res);
}
printf("Case #%d: %d\n", ++p, sum);
}
return 0;
}
The 2019 ICPC Asia Shanghai Regional Contest H Tree Partition k、Color Graph的更多相关文章
- 2019-2020 ICPC, Asia Jakarta Regional Contest H. Twin Buildings
As you might already know, space has always been a problem in ICPC Jakarta. To cope with this, ICPC ...
- 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)
2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...
- 2019 ICPC Asia Nanjing Regional
2019 ICPC Asia Nanjing Regional A - Hard Problem 计蒜客 - 42395 若 n = 10,可以先取:6,7,8,9,10.然后随便从1,2,3,4,5 ...
- 2019 ICPC Asia Xuzhou Regional
目录 Contest Info Solutions A. Cat B. Cats line up C. <3 numbers E. Multiply F. The Answer to the U ...
- 2019 ICPC Asia Yinchuan Regional
目录 Contest Info Solutions A. Girls Band Party B. So Easy D. Easy Problem E. XOR Tree F. Function! G. ...
- 2019-2020 ICPC, Asia Jakarta Regional Contest
目录 Contest Info Solutions A. Copying Homework C. Even Path E. Songwriter G. Performance Review H. Tw ...
- 2018 ICPC Asia Jakarta Regional Contest
题目传送门 题号 A B C D E F G H I J K L 状态 Ο . . Ο . . Ø Ø Ø Ø . Ο Ο:当场 Ø:已补 . : 待补 A. Edit Distance Thin ...
- UVALive 7141 BombX(离散化+线段树)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机
题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...
随机推荐
- maven 的安装与配置详细步骤
1. 直接搜索maven 2. 进入后点击download界面,这时出现的是当前最新版本, 当然还有以前的版本可供下载 3. 下载解压到你指定的目录后,需要配置一下环境变量. a. 右键此电脑点击属性 ...
- .NET Core学习笔记(9)——Entity Framework Core之Code First
上篇我们介绍了怎么通过已有的SQLServer表来创建实体类,本篇我们改用Code First的方式,由C#代码书写的实体类来生成SQLServer表.并且通过简单的Console APP往SQLSe ...
- .NET探索平台条件编译
前言 今天偶然机会,翻了一下大学期间的书籍<C程序设计>,好吧,当我翻着翻着,翻到了符号常量(#define指令)中,是啊,这是一个预处理器指令,记得在Magicodes.IE中针对平台选 ...
- 【Linux】使用 iperf 测试 Linux 服务器带宽
iperf 简介 iperf 是一个用于测试网络带宽的命令行工具,可以测试服务器的网络吞吐量.目前发现两个很实用的功能: 测试服务器网络吞吐量:如果我们需要知道某台服务器的「最大」网络带宽,那么最好在 ...
- 【Oracle】查询执行慢的sql
查询执行最慢的sql select * from (select sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS "执行次数", round ...
- uni-app开发经验分享十三:实现手机扫描二维码并跳转全过程
最近使用 uni-app 开发 app ,需要实现一个调起手机摄像头扫描二维码功能,官网API文档给出了这样一个demo: // 允许从相机和相册扫码 uni.scanCode({ success: ...
- memory barrier 内存屏障 编译器导致的乱序
小结: 1. 很多时候,编译器和 CPU 引起内存乱序访问不会带来什么问题,但一些特殊情况下,程序逻辑的正确性依赖于内存访问顺序,这时候内存乱序访问会带来逻辑上的错误, 2. https://gith ...
- 利用Mixins扩展类功能
8.18 利用Mixins扩展类功能 - python3-cookbook 3.0.0 文档 https://python3-cookbook.readthedocs.io/zh_CN/latest/ ...
- 在Centos7上安装Python+Selenium+Chrome+Chromedriver
1.下载Chrome 上一篇文章已经演示过了Python+Selenium+Firefox+Geckodriver安装步骤并通过自动化脚本打开百度 因此当前只需要安装Chrome和Chromedriv ...
- CF401C
扯在前面 本题的英文翻译很有意思,很符合CF大多题的故事风格,但是luogu的翻译更过于直白易懂 如果让我看英文故事做题我怕我都不知道该怎么下手 正文 题意: 构造一个01序列,包含n个0,m个1要求 ...