AT2046 Namori 图论
正解:
解题报告:
首先看数据范围可以发现要么是棵树要么是个奇环要么是个偶环
然后就分类讨论分别看下这几个情况
首先是棵树的
首先可以想到树的情况就是个二分图,所以不妨把颜色重定义,让奇数层的变成白色偶数层的变成黑色,然后就变成了,可以交换一个黑色和一个白色,求能否让白的都变成黑的.黑的都变成白的
然后再赋个值,令黑色为-1白色为1
首先无解的情况很容易想到嘛,就是当黑色白色的点本来就不相等的时候显然是布星的
然后继续想,设f[i]:点i额外转换的次数
显然答案的下界是∑abs(f[i])
然后可以想到这个∑abs(f[i])显然是可以达到的,有点儿像一个贪心的基础题忘了叫什么了,,,反正挺显然的?
然后考虑有环的情况,这儿要分奇环偶环分开讨论下
对于奇环,就相当于是连了同一奇偶性的两个点,就是说本来正常交换是一个+1一个-1正好抵消,而这样做就变成了都+1或者都+2,那就可以不保证黑色白色相等了,只要黑色白色的差值是偶数就可以通过这条边抵消掉
所以可以发现这条边的用处就是抵消差值,所以可以先算出差值,然后as+=差值/2,这时候这条边的作用就用完了,剩下就当树一样处理就好
对于偶环,其实从大局来看就和树是差不多的,就是假如现在已经在它们的lca之上了,那么这条多余的链反正修改起来也是+1-1的所以麻油什么影响
所以可以发现有影响的只是lca的子树内部的,也就是那个环上的
可以考虑设这条多余的链上运输了x次,然后可以发现,会改变的就左端点到lca会+=x,右端点到lca会-=x
然后被修改了的值列成式子就会变成,∑abs(t*f[i]-x),然后这儿t是±1,能get趴?就上面那个式子嘛
然后这个式子再仔细一看,小学奥数鸭,绝对值之和min就是取中位数的时候嘛
然后就做完啦啦啦!
放下代码QAQ
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define rg register
#define gc getchar()
#define t(i) edge[i].to
#define rp(i,x,y) for(rg int i=x;i<=y;++i)
#define my(i,x,y) for(rg int i=x;i>=y;--i)
#define e(i,x) for(rg int i=head[x];i;i=edge[i].nxt) const int N=1e5+;
int n,m,head[N],ed_cnt,sz[N],st,to,sum,as,top,stck[N],g[N];
struct ed{int to,nxt;}edge[N<<];
bool jud;
bool vis[N]; il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(int x,int y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;}
void dfs1(int x,int fa){e(i,x)if(t(i)^fa)if(sz[t(i)]){if(sz[t(i)]==sz[x])jud=;st=x;to=t(i);}else sz[t(i)]=-sz[x],dfs1(t(i),x);}
void dfs2(int x,int fa){vis[x]=;e(i,x)if(t(i)^fa && !((x==st && t(i)==to) || (x==to && t(i)==st)))dfs2(t(i),x),sz[x]+=sz[t(i)],g[x]+=g[t(i)];return;} int main()
{
n=read();m=read();rp(i,,m){int x=read(),y=read();ad(x,y);ad(y,x);}sz[]=;dfs1(,);
rp(i,,n)sum+=sz[i];if(!jud)if(sum)return printf("-1\n"),;
if(m==n)if(jud){if(sum&)return printf("-1\n"),;as+=abs(sum>>);sz[st]-=(sum>>);sz[to]-=(sum>>);}else g[st]=,g[to]=-;
dfs2(,);
rp(i,,n){if(g[i])stck[++top]=g[i]*sz[i];else as+=abs(sz[i]);}
stck[++top]=;sort(stck+,stck+top+);int mid=stck[(top+)>>];
rp(i,,top)as+=abs(stck[i]-mid);
printf("%lld\n",as);
return ;
}
AT2046 Namori 图论的更多相关文章
- 洛谷AT2046 Namori(思维,基环树,树形DP)
洛谷题目传送门 神仙思维题还是要写点东西才好. 树 每次操作把相邻且同色的点反色,直接这样思考会发现状态有很强的后效性,没办法考虑转移. 因为树是二分图,所以我们转化模型:在树的奇数层的所有点上都有一 ...
- AtCoder AGC004F Namori (图论)
题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_f 题解 神仙题.. 首先考虑树的情况,树是二分图,因此假设我们对二分图进行黑白染色,那么操作 ...
- [leetcode] 题型整理之图论
图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦. 求最短路径: 127. Word Ladder Given two words (beginWord and end ...
- 并查集(图论) LA 3644 X-Plosives
题目传送门 题意:训练指南P191 分析:本题特殊,n个物品,n种元素则会爆炸,可以转移到图论里的n个点,连一条边表示u,v元素放在一起,如果不出现环,一定是n点,n-1条边,所以如果两个元素在同一个 ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- HDU 5521 [图论][最短路][建图灵感]
/* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...
- SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- Java知多少(63)线程间通信
上述例题无条件的阻塞了其他线程异步访问某个方法.Java对象中隐式管程的应用是很强大的,但是你可以通过进程间通信达到更微妙的境界.这在Java中是尤为简单的. 像前面所讨论过的,多线程通过把任务分成离 ...
- 【转】搭建Java版WebService
原文地址:http://www.cnblogs.com/jasoncc/archive/2011/12/22/2296052.html Hi,大家好! 今天主要和大家分享,如何搭建一个Web服务,做A ...
- Windowsclient SSH 远程连接Windowsserver(PowerShell Server)
近期刚搞完SSH框架.又来研究研究SSH远程连接.为什么这么要弄这个呢?由于如今我如今开发主要在自己的笔记本(windows)上,然后写的后端都要部署到实验室的台式机(windows)上,这样一来,我 ...
- ios开发之--NSString中substringFromIndex,substringWithRange,substringToIndex方法的使用
1,substringFromIndex 从索引0开发到到index的后面的字符 2,substringWithRange 取指定range里面的字符,左边为索引index,右边为截取的范围 3,su ...
- 4. Oracle数据库用户管理备份与恢复
一. Oracle用户管理备份介绍 Oracle物理备份核心就是将物理文件拷贝一份副本:存放在磁盘上.物理文件指的是:数据文件,控制文件,日志文件,参数文件等等. 根据数据库状态而分:备份可分为热备份 ...
- KSQL和Flink SQL的比较
Confluent公司于2017年11月宣布KSQL进化到1.0版本,标志着KSQL已经可以被正式用于生产环境.自那时起,整个Kafka发展的重心都偏向于KSQL——这一点可以从Confluent官方 ...
- iOS(WKWebView)OC与JS交互 之三
随着H5功能愈发的强大,没进行过混合开发的小伙们都不好意思说自己能够独立进行iOS的app开发,在iOS7操作系统下,常用的native,js交互框架有easy-js,WebViewJavascr ...
- 推荐一款好用的文件/文件夹对比工具 —— Beyond Compare
推荐一款好用的文件/文件夹对比工具 —— Beyond Compare! 有需要的人,用了都说好: 不知道这个是干嘛用的,说再多也没用.
- RabbitMQ随笔
不管是官方还是能搜到的文章,使用MQ的基本思路都是这样: static void Main(string[] args) { //通过工厂建立连接 using (IConnection connect ...
- Phoenix系列:二级索引(2)
上一篇介绍了Phoenix基于HBase的二级索引的基本知识,这一篇介绍一下和索引相关的一致性和优化相关内容. 一致性的保证 Phoenix客户端在成功提交一个操作并且得到成功响应后,就代表你所做的操 ...