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的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. 2019 ICPC Asia Yinchuan Regional

    目录 Contest Info Solutions A. Girls Band Party B. So Easy D. Easy Problem E. XOR Tree F. Function! G. ...

  6. 2019-2020 ICPC, Asia Jakarta Regional Contest

    目录 Contest Info Solutions A. Copying Homework C. Even Path E. Songwriter G. Performance Review H. Tw ...

  7. 2018 ICPC Asia Jakarta Regional Contest

    题目传送门 题号 A B C D E F G H I J K L 状态 Ο . . Ο . . Ø Ø Ø Ø . Ο Ο:当场 Ø:已补 .  :  待补 A. Edit Distance Thin ...

  8. UVALive 7141 BombX(离散化+线段树)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  9. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

随机推荐

  1. .net core 中使用Log4net输出日志到Mysql数据库中

    .net core 中使用Log4net输出日志到数据库中去 1.使用Nuget安装log4net 和 mysql.data 2.设置log4net 的配置文件 log4net.config 可以设置 ...

  2. leetcode-242有效字母异位词

    题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = "nagaram&quo ...

  3. nginx: [emerg] bind() to 0.0.0.0:80 failed (10013:

    问题出现 今天在win10安装nginx时候,启动nginx.exe时在dos窗口出现了这个错误,特此记录一下. 解决方法 上面报错信息的意思大概是:0.0.0:80地址访问不被允许.可能是80端口号 ...

  4. 使用Jenkins+Blue Ocean 持构建自动化部署之安卓源码打包、测试、邮件通知

    什么是BlueOcean? BlueOcean重新考虑了Jenkins的用户体验.BlueOcean由Jenkins Pipeline设计,但仍然兼容自由式工作,减少了团队成员的混乱,增加了清晰度. ...

  5. 2.jmeter组件介绍

    jmeter默认语言设置:  1.临时设置: 进入options -- Choose Language -- 选择中文简体,设置后语言  切换成中文,重启失效  2.永久设置:进入jmeter目录下的 ...

  6. Python绘制雷达图(俗称六芒星)

    原文链接:https://blog.csdn.net/Just_youHG/article/details/83904618 背景 <Python数据分析与挖掘实战> 案例2–航空公司客户 ...

  7. 目前用下来最溜的MacOS微信多开工具!

    一个生活微信,一个工作微信是很多上班族的基本配置. 但由于微信客户端在PC端上只能打开一个,这使得在上班时候就非常不便,一个号在PC端上登录,一个在手机上使用,但是上班时候又不能一直看手机,不然老板还 ...

  8. WeihanLi.Npoi 1.14.0 Release Notes

    WeihanLi.Npoi 1.14.0 Release Notes Intro 周末更新了一下项目,开始使用可空引用类型,并且移除了 net45 的支持,仅支持 netstandard2.0 Cha ...

  9. Trino总结

    文章目录 1.Trino与Spark SQL的区别分析 2.Trino与Spark SQL解析过程对比 3.Trino基本概念 4.Trino架构 5.Trino SQL执行流程 6.Trino Ta ...

  10. pycharm工具的使用

    一.Pycharm常用快捷键 快捷键 作用 备注  ctrl + win + 空格  自动提示并导包  连按两次  ctrl + alt + 空格  自动提示并导包  连按两次  Alt + Ente ...