[学习笔记]支配树

被支配树支配的恐惧

定义

显然,这个支配关系是一个树(或者如果有的点不能从r到达,就是一个树+一堆点)。

首先不会成环,其次也不会是DAG

即如果A支配C,B支配C,那么A和B之间必然有支配关系

解法

首先是DAG很好做:

[ZJOI2012]灾难

一般有向图:有环的存在,不能topo

方法分三步:

转化为找半支配点

idom[x]表示x的支配点编号

sdom[x]表示x的半支配点编号

先找到原图一个生成树,找到每个点的dfn序

 

定义半支配关系为:

定义半支配点为:

即满足支配关系dfn最小的点

 

一些认识:

A对于dfs树

B对于支配和半支配

 

半支配点也一定是x在dfs树上的祖先

 

请大量运用反证法和dfs算法的深度优先性质进行证明

 

虽然sdom[x]可能不是idom[x]

但是可以断言:

证明:

实在不懂可以画图感性理解

 

所以如果知道sdom[x],现在已经可以专化为求DAG的支配树了

 

如何找半支配点

 这个做法就是前面两个认识的两种情况。

dfn[z]>dfn[y]启发我们倒序处理

这样,x在T'的祖先z一定都是之前加入的,一定比y的dfn大,直接取即可。

实现维护T'?

改进:同时找支配点

 

(fix:每个点从一个祖先连过来恰好一条边)

证明略

直接看算法流程吧:

从简化之后的G'角度进行考虑(基本上就是一个树形结构了),就很好理解了。

补充:

第5步之所以找fa[y],因为先有第4步,使得当前的根是fa[y],(4/5两步交换,就可以直接处理sdom[x]=y的点x了)

第6步的标记还原:必须dfs序正序处理。打标记,如果没有idom[x]=sdom[x],那么进行处理。

开始时候,令sdom[x]=x可以省去很多麻烦!!

Code

注意比较函数的书写。argmin与argmax

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}namespace Miracle{
const int N=2e5+5;
const int M=3e5+5;
int n,m;
struct node{int nxt,to;
}e[M];
int hd[N],cnt;
void add(int x,int y){e[++cnt].nxt=hd[x];e[cnt].to=y;hd[x]=cnt;
}
vector<int>mem[N],fr[N];
int fa[N],dfn[N],fdfn[N],idom[N],sdom[N],df;
int gf[N],val[N];
bool cmp(int x,int y){//x<y?return dfn[sdom[x]]<dfn[sdom[y]];
}
int chm(int x,int y){return dfn[x]<dfn[y]?x:y;
}
int fin(int x){if(gf[x]==x) return x;int rt=fin(gf[x]);val[x]=cmp(val[x],val[gf[x]])?val[x]:val[gf[x]];return gf[x]=rt;
}
void dfs(int x){dfn[x]=++df;fdfn[df]=x;for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;if(dfn[y]) continue;fa[y]=x;dfs(y);}
}
void wrk(){for(reg i=n;i>=2;--i){int x=fdfn[i];for(reg j=0;j<(int)fr[x].size();++j){int y=fr[x][j];if(dfn[y]<dfn[x]){sdom[x]=chm(y,sdom[x]);}else{int haha=fin(y);sdom[x]=chm(sdom[val[y]],sdom[x]);}}mem[sdom[x]].push_back(x);gf[x]=fa[x];x=fa[x];for(reg j=0;j<(int)mem[x].size();++j){int y=mem[x][j];int haha=fin(y);if(sdom[val[y]]==sdom[y]) idom[y]=sdom[y];else idom[y]=val[y];}}for(reg i=2;i<=n;++i){int x=fdfn[i];if(idom[x]!=sdom[x]) idom[x]=idom[idom[x]];}
}
int sz[N];
void sol(int x){sz[x]=1;for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;sol(y);sz[x]+=sz[y];}
}
int main(){rd(n);rd(m);int x,y;for(reg i=1;i<=m;++i){rd(x);rd(y);add(x,y);fr[y].push_back(x);}dfs(1);    for(reg i=1;i<=n;++i){sdom[i]=i,val[i]=i,gf[i]=i;}wrk();memset(hd,0,sizeof hd);cnt=0;for(reg i=2;i<=n;++i){add(idom[i],i);}// prt(dfn,1,n);// prt(fa,1,n);// prt(sdom,1,n);// prt(idom,1,n);sol(1);prt(sz,1,n);return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*
*/

例题

其实就是[ZJOI2012]灾难

别的没什么题目。。。。

转载于:https://www.cnblogs.com/Miracevin/p/10819686.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RBAC 权限设计(转载)

来源 &#xff1a;https://blog.csdn.net/rocher88/article/details/43190743 这是我在网上找的一些设计比较好的RBAC权限管理不知道&#xff0c;像新浪、搜狐、网易、百度、阿里巴巴、淘宝网的RBAC用户权限这一块&#xff0c;都是这种细颗粒的RBAC设计开发&#xff0c;还是把他…

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结 教材学习内容总结 本周对JAVA中的多态性进行了学习 多态性引用能够随时间变化指向不同类型的对象&#xff0c;是通过后绑定实现的。实现多态性的主要途径有两种&#xff1a; 1.由继承实现多态性 2.利用接口实现多态…

Linux系统安装Apache 2.4.6

http://www.cnblogs.com/kerrycode/p/3261101.html Apache简介 Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的网页服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其多平台和安全性被广泛使用&#xff0c;是最…

lnmp化境开启pathinfo,支持tp5.0等访问

一、 开启pathinfo   #注释 下面这一行 #include enable-php.conf #载入新的配置文件 include enable-php-pathinfo.conf #添加如下location / {if (!-e $request_filename){rewrite ^/(.*)$ /index.php/$1 last;break;}}location ~ /index.php {fastcgi_pass 127.0.0.1:…

openfire(一):使用idea编译openfire4.2.3源码

最近公司项目要使用openfire&#xff0c;并对源码做一些修改&#xff0c;使用的openfire版本为官网目前最新版本4.2.3&#xff0c;网上资料较少&#xff0c;踩了很多坑&#xff0c;特此记录。 1.下载源码 http://www.igniterealtime.org/downloads/source.jsp 2.使用idea导入源…

[BZOJ] 1688: [Usaco2005 Open]Disease Manangement 疾病管理

1688: [Usaco2005 Open]Disease Manangement 疾病管理 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 727 Solved: 468[Submit][Status][Discuss]Description Alas! A set of D (1 < D < 15) diseases (numbered 1..D) is running through the farm. Farmer John woul…

Image-to-Image Translation with conditional Adversarial Networks ---- Pix-2-Pix

任务场景 Photos to semantic segmentationCityscapes labels to photosColorizationFacades labels to photoDay to nightThe edges to photoAnd so on.在生成器模型中&#xff0c;条件变量y实际上是作为一个额外的输入层&#xff08;additional input layer&#xff09;&…

5分钟从零构建第一个 Apache Flink 应用

为什么80%的码农都做不了架构师&#xff1f;>>> 在本文中&#xff0c;我们将从零开始&#xff0c;教您如何构建第一个Apache Flink &#xff08;以下简称Flink&#xff09;应用程序。 开发环境准备 Flink 可以运行在 Linux, Max OS X, 或者是 Windows 上。为了开发…

Android6.0------权限申请RxPermissions

前面写了Android6.0权限介绍和权限单个&#xff0c;多个申请&#xff0c;用的是纯Java代码&#xff0c;本文主要说的是借助第三方库来实现权限申请。 借助第三方库 RxPermissions来申请6.0权限。 RxPermissions库地址&#xff1a;https://github.com/tbruyelle/RxPermissions …

博客作业04--树

1.学习总结(2分) 1.1树结构思维导图 1.2 树结构学习体会 树这一章节比较复杂&#xff0c;知识点繁多&#xff0c;结合了递归的知识所以代码阅读起来会有障碍&#xff0c;难以理解&#xff0c;所以学起来比较吃力&#xff0c;而且很多经典的算法理解的不是很透彻解决pta上的问题…

[DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料

首先我想吐槽的是题目并没有表明数据范围。。。 这个题目 DP方程并不难表示。 dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] dp[i-1][k] (j-k) * cost j*j*(leng[i]-leng[i-1]) 如果你这样直接提交上去&#xff0c;恭喜你超时&#xff01;&#xff01;&#xff0…

039_MySQL_多表查询

#创建部门 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment PRIMARY KEY,dname VARCHAR(50) not null COMMENT 部门名称 )ENGINEINNODB DEFAULT charset utf8;#添加部门数据 INSERT INTO dept VALUES (1, 教学部); INSERT INTO dept VALUES (2, 销售部); IN…

4.navicat11激活教程,亲测可用哦!

原文地址&#xff1a;http://blog.csdn.net/sanbingyutuoniao123/article/details/52589678Navicat是一款数据库管理工具, 用于简化, 开发和管理MySQL, SQL Server, SQLite, Oracle 和 PostgreSQL 的数据库&#xff1b;Navicat数据模型工具以图形化方式创建关联式数据库&#x…

想要去阿里面试?你必须得跨过 JVM 这道坎!

概述 很多人想要到阿里巴巴、美团、京东等互联网大公司去面试&#xff0c;但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累和实践经验&#xff0c;毕竟线上系统写好代码部署之后&#xff0c;每个工程师都必须关注JVM相关的东西&#xff0c;比如OOM、GC等问题. 所以一…

医学知识图谱一

大纲 知识自动提取技术 医学知识融合 医学知识推理 转载于:https://www.cnblogs.com/quietwalk/p/9000950.html

在一个div里,列表样式图片进行float,实现水平排序

<div class"xiangce"><ul> <li><a href"#"><img src"images/pic4.gif" alt"">产品名称</a></li><li><a href"#"><img src"images/pic4.gif" alt"…

The listener supports no services

$ lsnrctl start 报错提示: The listener supports no services The command completed successfully 如图所示&#xff1a; 这样启动后远程连接会报错&#xff1a; oracle ORA-12514:TNS:listener does not currently know of service requested in connect descriptor 问题原…

SEO【总结】by 2019年5月

2019独角兽企业重金招聘Python工程师标准>>> 关键点&#xff1a; 1、代码 1.1、seo前端代码&#xff1a;基于Html代码的SEOherf&#xff1a;https://my.oschina.net/u/2862573/blog/3030664 注意的要点&#xff1a; h1&#xff0c;h2的内容很关键 网页的压缩、静态化…

Oracle数据库 查看表是否是 索引组织表的方法

1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一个字段. 见图: 转载于:https://www.cnblogs.com/jinanxiaolaohu/p/9018037.html

Windows server 2016 搭建RDS服务

计算机的更新换代太快&#xff0c;新购置的计算机没几年便觉得运行速度越来越慢&#xff0c;尤其是在运行一些比较大的应用程序是&#xff0c;用户总是抱怨运行速度太慢或者总是死机等问题。如果要更换新的计算机&#xff0c;又得不到领导的批准&#xff0c;因此对于企业来说&a…