[jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)
Link
https://jzoj.net/senior/#main/show/3506
Description
从前有一个善良的精灵。
一天,一个年轻人B找到她并请他预言他的未来。这个精灵透过他的水晶球看到这个年轻人将要遇见一个非常美丽的公主并要娶她。。精灵在一张纸上画了N个点并用一些线段将他们连起来,每条线段两端连着不同的点。画完了之后,精灵让年轻人去除一条线段。然后精灵尝试将每个点用红色或者蓝色进行染色,同时使得那里没有一条线段的两端是相同的颜色。如果精灵能够成功染色,这个预言就能成真。
年轻人想要遇见那位公主,因此他请求你去帮助他,找到所有的删除之后能对图进行成功染色的线段。
Solution
0~99分
显然爆搜。
100分
题目大意就是“给你一个无向图,让你删去一条边,使得原图无奇环”
既然考虑到环的奇偶性,自然就得考虑到其个数。按照惯例,绘制一个深度优先生成树(DFS树)
怎么绘制呢?
选择一个点为根,按照DFS的顺序,连出一棵树。当一个点连向一个深度小与它的点,显然,就构成了一个环。
我们称这条边为返祖边,这个环的大小就是两点深度差+1。
然后在树上弄一个类似差分约束的思路,来求出当前边被多少个奇数,偶数环所包括。
对于一条边
(1)全图无环或者只有一个偶环,当前边可以删
(2)如果不符合(1),可以删当前边,仅当当前边被这个图所有奇数环覆盖,且不被一个偶数环包括。
引理1易证
引理2:如果奇数和偶数环在一起,删完后一定不满足。如果不包括所有奇数环,那么在不被当前边包括的奇数环就不满足。
Code
{$inline on}
var
n,m,i,x,y,tot,tot1,papa:longint;
w:array[..] of longint;
dis:array[..] of boolean;
data:array[..] of longint;
pre,tov,last:array[..] of longint;
pre1,tov1,cos1,last1:array[..] of longint;
ji,ou,numj,numo:array[..] of longint;
procedure insert(x,y:longint); inline;
begin
inc(tot);
tov[tot]:=y;
pre[tot]:=last[x];
last[x]:=tot;
end; procedure insert1(x,y,z:longint); inline;
begin
inc(tot1);
tov1[tot1]:=y;
cos1[tot1]:=z;
pre1[tot1]:=last1[x];
last1[x]:=tot1;
end; procedure dg(x,q,shen:longint); inline;
var
k:longint;
begin
dis[x]:=true;
w[x]:=shen; k:=last[x]; while k<> do
begin
if tov[k]<>q then
begin
if not dis[tov[k]] then
begin
insert1(x,tov[k],(k+) shr ); dg(tov[k],x,shen+);
end
else
if w[tov[k]]<w[x] then
begin
if odd(w[tov[k]]-w[x]+) then
begin
inc(ji[x]);
dec(ji[tov[k]]); numj[(k+) shr ]:=; inc(papa);
end
else
begin
inc(ou[x]);
dec(ou[tov[k]]); numo[(k+) shr ]:=;
end;
end;
end; k:=pre[k];
end;
end; procedure find(x:longint); inline;
var
k:longint;
begin
k:=last1[x]; while k<> do
begin
find(tov1[k]); numj[cos1[k]]:=ji[tov1[k]];
numo[cos1[k]]:=ou[tov1[k]]; inc(ji[x],numj[cos1[k]]);
inc(ou[x],numo[cos1[k]]); k:=pre1[k];
end;
end;
begin
assign(input,'fairy.in');reset(input);
assign(output,'fairy.out');rewrite(output); readln(n,m); for i:= to m do
begin
readln(x,y); insert(x,y);
insert(y,x);
end; for i:= to n do
if not dis[i] then
begin
dg(i,,); find(i);
end; for i:= to m do
if ((numj[i]=papa) and (numo[i]=)) or (papa=) then
begin
inc(data[]); data[data[]]:=i;
end; writeln(data[]); for i:= to data[] do
write(data[i],' ');
end.
[jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)的更多相关文章
- JZOJ 3505. 【NOIP2013模拟11.4A组】积木(brick)
3505. [NOIP2013模拟11.4A组]积木(brick) (File IO): input:brick.in output:brick.out Time Limits: 1000 ms Me ...
- JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C
3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...
- JZOJ 3508. 【NOIP2013模拟11.5B组】好元素
3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms Mem ...
- JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)
3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...
- JZOJ 3526. 【NOIP2013模拟11.7A组】不等式(solve)
3526. [NOIP2013模拟11.7A组]不等式(solve) (File IO): input:solve.in output:solve.out Time Limits: 1000 ms M ...
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告
题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...
- JZOJ 3487. 【NOIP2013模拟联考11】剑与魔法(dragons)
3487. [NOIP2013模拟联考11]剑与魔法(dragons) (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB De ...
随机推荐
- TERADATA SQL学习随笔<一>
此博客内容简介及目录 http://www.cnblogs.com/weibaar/p/6644261.html 最近在TERADATA环境学习SQL.在这里记录一下学习中查过的知识点,作为备案. 目 ...
- vue-router.esm.js:1905 TypeError: Cannot convert undefined or null to object
环境:vue+vuex+element 报错原因 ...mapState('isDialNumber') mapState如果传递一个参数,参数必须是数组 ...mapState(['isDialNu ...
- Linux使用CFSSL自签TLS证书
⒈安装CFSSL wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson ...
- dubbo基本信息
1.Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目. 面试官问你如果这个都不清楚,那下面的就没必要问了. 官网: ...
- 011_TCP专项研究监控
(1)In Segs 数据源: /proc/net/snmp; 采集方式:累计值,每10秒采集一次取差值: 指标:net.snmp.tcp (key: system); In Segs: tcp协议层 ...
- linux环境变量问题
在使用jenkins进行自动化部署的时候遇到一个问题,通过jenkins进行自动化部署的时候执行java命令时,提示java不知道是啥命令,确定是装好了java的,猜测是环境变量问题,但是在/etc/ ...
- 创建Git 仓库及 克隆、拉取、和推送操作
打开网址: https://github.com/ 登录上自己创建的 Git账号 一. 创建Git 仓库 start a project---> 输入仓库 ...
- P2255 [USACO14JAN]记录奥林比克
P2255 [USACO14JAN]记录奥林比克 题目描述 农民约翰热衷于所有寒冷天气的运动(尤其是涉及到牛的运动), 农民约翰想录下尽可能多的电视节目. 为moolympics电视时间表由N个不同的 ...
- kvm虚拟机中鼠标不同步的问题解决方法
环境:Centos7.6安装kvm创建windows虚拟机,通过novnc连接到虚拟机上发现存在鼠标位置偏移问题 解决方法: 方法一: 经测试,windows系列虚拟机关闭鼠标加速亦可缓解该问题,不过 ...
- cocos creator 动画编辑器以及骨骼动画的使用
一.普通动画的设置 1.添加动画组件 a.添加空节点=>添加动画组件 b.新建Clip文件=>打开编辑模式添加动画编辑(并且把添加的clip文件拖动到右边面板的Default Clip 与 ...