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 ...
随机推荐
- IllegalArgumentException:@Body parameters cannot be used with form or multi-part encoding
使用retrofit时报错IllegalArgumentException:@Body parameters cannot be used with form or multi-part encodi ...
- 【转】HTML embed标签使用方法和属性详解
一.基本语法 代码如下: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等,Netscape及新版的IE 都支持.url为音 ...
- (笔记)AT91SAM9260的启动过程详细解说
Bootstrap的启动过程 一. 说明: Bootstrap启动代码是官方提供的一级启动代码,包括汇编和C语言两部分组成.对AT91SAM9260来说编译完成后,代码长度必须小于4KB,烧写到dat ...
- json 报错'xxx is not JSON serializable'的处理方法
场景: 报错: 原因: json不能对np.int64或者np.float64等类型进行序列化,可以通过自定义serializer或者直接类型转换来解决. 解决方法: 显式的把 date 转换成 in ...
- json_decode 为空
传递参数 wsk/addorder?goods=[{"gsn":802006,"number":1},{"gsn":103761," ...
- Java中浮点数的处理
import java.text.DecimalFormat; String addGold = String.valueOf(new DecimalFormat("0").for ...
- PHP伪造referer突破网盘禁止外链(附115源码)
新建一个文件file.php.后面的参数就是需要伪造referfer的目标地址吧.如:file.php/http://www.xxx.xxx/xxx.mp3 复制内容到剪贴板 代码: <?$ur ...
- Windowsclient SSH 远程连接Windowsserver(PowerShell Server)
近期刚搞完SSH框架.又来研究研究SSH远程连接.为什么这么要弄这个呢?由于如今我如今开发主要在自己的笔记本(windows)上,然后写的后端都要部署到实验室的台式机(windows)上,这样一来,我 ...
- css---计算页面的的宽度和长度
我们在写前端页面的时候,会遇到这样的情况,就是一个div设置宽度100%,设置左右边距10像素,这样的布局,在里面嵌套的div的宽度设置100%,这样写的话,里面的宽度是和外面的宽度一致的,同样是10 ...
- linux升级内核