【codeforces】Codeforces Round #363

QAQ在外面学(qi)习(liao)听不懂了郁闷于是去打比赛23333333
然后拉上了⑨233333mdzz
然后就有了这场233333

D

题目大意

给你一棵树
不不不
给你一个序列
其中表示i的父亲为 ai
问你能否通过修改尽量少的 ai 使得这个为一颗合法的树


我完全没想法2333333
我决定翻译题解……

定义functional graph为每一个点出度均为1的图
这个图被分成了许多个圈的集合并且每一个圈上的点是他自己所在那棵树的根,当然也有可能只有一个节点(如果他不是根,那么它一定有一条连向根节点的边,但是它又在圈上,那么它就有了两条出度,不符合functional graph的定义)
借一下官方的图,侵删
这里写图片描述

这张图就是一个functional graph的例子,这里有两个圈,一个是1,6,3另一个是4。节点6是0,2,6,8的根,节点3是3,5的根,节点4是4,7的根,然后1是只有自己的那棵树的根
在functional graph的条件下,我们的目标是构造一个图包含且仅包含一个圈,并且那个圈是一个环
改变的操作等价于消除一些出边并且加入一条连向其他点的新边
先让我们的图仅包含一个圈,这样做之后,就可以选择任何一个之前的圈,并说它就是最后剩下的那一个,然后我们需要考虑其他的所有的圈,改变在圈中的任意一条边,让它指向刚刚我们选择的那个圈,因此这个圈将会被破坏掉并且它的节点(沿着树)将会被连接到刚刚选择的那个圈上,这之后我们需要将圈的个数-1.注意到改变一个不在圈上的点是没有意义的,因为这样不会破坏任何一个圈
接下来的事情是讲圈变成环。有可能我们之前已经做到了,如果我们刚开始选择了的就是一个环的话。因此如果最初的图包含一个环的话,我们就只需要做圈数-1次操作。另外,如果这个圈的节点超过1个的话。那么它可以通过一次额外的操作来消除这个圈——一个只需要破坏任何一条在圈中的边,比如说删除从u到 au 的边,然后添加一条从u到u的一条边,那么这个图就会仅剩一个环,如果是这样的话我们需要的操作数是圈数
为了做这所有的操作,可以用DSU结构(这是啥?)或者仅仅一系列的DFS注意到我们不需要实现变得消除和重建,仅仅只需要分析最初的图就好
QAQ打不完了
慢慢补~
嘛,签到咯~
2016年10月4日20:30:50

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值