[agc004f]Namori 贪心
Description
现在给你一张NN个点MM条边的连通图,我们保证N−1≤M≤NN−1≤M≤N,且无重边和自环。
每一个点都有一种颜色,非黑即白。初始时,所有点都是白色的。
想通过执行若干次某种操作的方式,来将所有的点变成黑色。操作方式如下:
选择一对颜色相同的****相邻的节点(存在边直接连接彼此),将它们的颜色反转。即若原来都是白色,则都变成黑色,反之亦然。
现在想知道,他能否通过执行这种操作以达到目的。如果可以,他还希望步数尽可能的少。
Input
第一行有两个正整数NN和MM(2≤N≤1052≤N≤105,N−1≤M≤NN−1≤M≤N)
接下来MM行,每行2个正整数aa和bb(1≤a,b≤N1≤a,b≤N),表示每条边连接的两个点。
Output
如果存在操作方案能达到目的,请输出最少操作次数。
否则,请输出−1−1
Sample Input
Sample Input 1
6 5
1 2
1 3
1 4
2 5
2 6
Sample Input 2
3 2
1 2
2 3
Sample Input 3
4 4
1 2
2 3
3 4
4 1
Sample Input 4
6 6
1 2
2 3
3 1
1 4
1 5
1 6
Sample Output
Sample Output 1
5
Sample Output 2
-1
Sample Output 3
2
Sample Output 4
7
HINT
如第一个样例中,存在如下操作方案:

Sol
如果是一棵树,我们把深度为奇数的点赋值为1,偶数-1,然后判断总和是否为0即可。此时答案为\(\sum_{i=1}^{n}abs(s[i])\),\(s[i]\)表示子树和。证明:我们让子树变成0的最小操作次数就是绝对值,因为一次操作至多改变1。
如果是个基环树,那么我们判断这个环连的两个点深度是否同奇同偶,同的话每次能够且仅能够添加或者删除2个权值,这样的话我们判断sum是不是一个偶数,是的话我们把s[u]和s[v]减去sum/2,然后做一次树的做法即可。
如果不同,说明我们无法改变总和,只能通过这个边进行直接对于不同深度的传输,我们假设u的权值+x,v的权值-x(只是系数,x能是任何数字),然后我们进行系数的子树和,这样的话求出系数为1或者-1的所有点,这些点是要加上x的,剩下的直接取abs,加上x的地方我们把它系数置为1(改变数字的正负强制改变系数),然后丢进一个数组,排序后取中位数即为最优解。
Code
#include <bits/stdc++.h>
using namespace std;
int fa[100005],c[100005],d[100005],s[100005],g[100005],i,j,k,l,t,n,m,u,v,a,b,x,tot,num,vis[100005],ok;
long long ans;vector<int>e[100005];
void dfs1(int x,int y)
{
vis[x]=1;
for(int i=0;i<e[x].size();i++) if(e[x][i]!=y)
{
if(vis[e[x][i]]){u=x;v=e[x][i];if(c[u]==c[v]) ok=1;}
else{c[e[x][i]]=c[x]^1;dfs1(e[x][i],x);}
}
}
void dfs(int x,int y)
{
for(int i=0;i<e[x].size();i++) if(e[x][i]!=y&&!((x==u&&e[x][i]==v)||(x==v&&e[x][i]==u)))
dfs(e[x][i],x),d[x]+=d[e[x][i]],s[x]+=s[e[x][i]];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d",&j,&k),e[j].push_back(k),e[k].push_back(j);
c[1]=1;dfs1(1,0);
for(int i=1;i<=n;i++) s[i]=c[i]?1:-1;
for(int i=1;i<=n;i++) num+=s[i];
if(m==n-1){if(num){printf("-1\n");return 0;}}
else
{
if(ok){if(abs(num%2)==1){printf("-1\n");return 0;}s[u]-=num/2;s[v]-=num/2;ans+=(long long)abs(num/2);}
else{if(num){printf("-1\n");return 0;}d[u]=1;d[v]=-1;}
}
dfs(1,0);
for(int i=1;i<=n;i++) if(!d[i]) ans+=(long long)abs(s[i]);else g[++tot]=-s[i];
g[++tot]=0;sort(g+1,g+tot+1);x=g[(tot+1)/2];
for(int i=1;i<=tot;i++) ans+=(long long)abs(g[i]-x);
printf("%lld\n",ans);
}
[agc004f]Namori 贪心的更多相关文章
- 2017国家集训队作业[agc004f]Namori
2017国家集训队作业[agc004f]Namori 题意: 给你一颗树或环套树,树上有\(N\)个点,有\(M\)条边.一开始,树上的点都是白色,一次操作可以选择一条端点颜色相同的边,使它的端点颜色 ...
- AGC004F Namori 树形DP、解方程(?)
传送门 因为不会列方程然后只会树上的,被吊打了QAQ 不难想到从叶子节点往上计算答案.可以考虑到可能树上存在一个点,在它的儿子做完之后接着若干颜色为白色的儿子,而当前点为白色,只能帮助一个儿子变成黑色 ...
- Atcoder:AGC004F Namori
传送门 先考虑树,树是一个二分图. 看到是二分图并且每次是对两边的同色的点反色可以想到转化:让奇数层的点为黑,偶数为白,变成每次可以交换两个点的颜色. 把黑看成 \(-1\),白看成 \(1\),那么 ...
- [AGC004F] Namori
Description 现在给你一张N个点M条边的连通图,我们保证N−1≤M≤N,且无重边和自环. 每一个点都有一种颜色,非黑即白.初始时,所有点都是白色的. "全"想通过执行若干 ...
- AtCoder AGC004F Namori (图论)
题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_f 题解 神仙题.. 首先考虑树的情况,树是二分图,因此假设我们对二分图进行黑白染色,那么操作 ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- NOIp模拟赛二十九
又是受虐的一天呢~接下来四天都要打模拟赛QAQ 今日分数:0(100)+100+0=100 A题O(读入)结论题判断结果时没return 0被subtask卡成0分,喜提fstQAQ,B题DP,C题不 ...
- 【agc004F】Namori
Portal -->agc004F Solution 好神仙的转化qwq 首先我们可以先考虑\(m=n-1\)的情况下,也就是树的情况下要怎么做 我们可以将这个问题转化一下:我们对这颗 ...
随机推荐
- 你不知道的高性能Javascript
想必大家都知道,JavaScrip是全栈开发语言,浏览器,手机,服务器端都可以看到JS的身影. 本文会分享一些高效的JavaScript的最佳实践,提高大家对JS的底层和实现原理的理解. 数据存储 计 ...
- 排序总结---常用的排序算法总结,java和js实现
这篇博客对几种常见的排序算法进行归纳总结,在接下来的博客中会依次给出每个排序算法的例子 [由于博客上面进行编辑不太方便,图表都是在电脑上编辑好,上传的图片] 1.排序的分类 2.几种内部排序方法的比较 ...
- Spark之 使用SparkSql操作mysql和DataFrame的Scala实现
通过读取文件转换成DataFrame数据写入到mysql中 package com.zy.sparksql import java.util.Properties import org.apache. ...
- CSS的编写规范
一.前言 如上图,页面在渲染和画图时,耗时还是比较多的,这就对我们的编写要求愈加严格. 我们有很多方法来减少上图所示的页面加载耗时的,比如 但是更多的还是在于平时的编写规范,我们需要了解浏览器,让他更 ...
- winfrom在图片上实现绘制
在控件加载入图片的基础上进行绘制内容 添加文字 首先就是要确定输入的文字,还有文字的样式. 文字的样式用到了FontDialog控件,获取文字呢,就放个textbox就可以了.如果在输入文字的显示展示 ...
- 如何清除保存的FTP用户名和密码
很多人习惯登陆FTP时选择保存密码,这样下次只需打开地址就可以进入FTP的页面了.这样确实方便,但如果遇到更换别的FTP用户名登陆,该怎么办?相信不少人还真答不出.重装浏览器,或者重装系统?呵呵, ...
- Python下Pip的安装【get-pip】
1.下载 下载https://bootstrap.pypa.io/get-pip.py 如果不能下载,可下载:http://files.cnblogs.com/files/zhangzhiming/g ...
- ChainOfResponsibilityPattern(23种设计模式之一)
参考书籍:设计模式-可复用面向对象软件基础(黑皮书) 目的:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理它为止 ...
- 面向对象的JavaScript-006-Function.prototype.apply()的3种作用
1. // Function.prototype.apply()的作用 // 1.Using apply to chain constructors Function.prototype.constr ...
- 我不是一名UX设计师,你也不是
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 最近几年,用户体验这个术语开始出现.而且随着它的发展,我们也见证了用户体验设计师的崛起. 每隔几个月 ...