HDU.4694.Important Sisters(支配树)
\(Description\)
给定一张简单有向图,起点为\(n\)。对每个点求其支配点的编号和。
\(n\leq 50000\)。
\(Solution\)
支配树。
还是有点小懵逼。
不管了,说不定会讲,反正以后再说。
https://blog.csdn.net/litble/article/details/83019578
有图的:https://blog.csdn.net/VioletSu/article/details/81041954
有题的:https://blog.csdn.net/L_0_Forever_LF/article/details/79386508
有怎么卡纯路径压缩并查集的:https://www.cnblogs.com/meowww/archive/2017/02/27/6475952.html
记几个名词:
\(Lengauer\ Tarjan\)算法。
半支配点(\(semi-dominator\)),记作\(semi(x)\)。
最近支配点(\(immediate\ dominator\)),记作\(idom(x)\)。
想不到我竟然也有把if(x==y)
写成if(x=y)
而且还调半天的时候...
//1107MS 8292K
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=50005,M=1e5+5;
int Index,dfn[N],ref[N],F[N],fa[N],mn[N],semi[N],idom[N],Ans[N];
struct Graph
{
int Enum,H[N],nxt[M],to[M];
inline void Clear(int n)
{
Enum=0, memset(H,0,n+1<<2);
}
inline void AE(int u,int v)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
}
}G,RG,SG,T;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void DFS0(int x)
{
ref[dfn[x]=++Index]=x;
for(int i=G.H[x],v; i; i=G.nxt[i])
if(!dfn[v=G.to[i]]) fa[v]=x, DFS0(v);
}
int Find(int x)
{
if(x==F[x]) return x;
int tmp=F[x];
F[x]=Find(F[x]);
if(dfn[semi[mn[tmp]]]<dfn[semi[mn[x]]]) mn[x]=mn[tmp];
return F[x];
}
void DFS(int x,int s)
{
Ans[x]=s+=x;
for(int i=T.H[x]; i; i=T.nxt[i]) DFS(T.to[i],s);
}
void Solve(int n)
{
for(int k=n; k>1; --k)
{
int x=ref[k],t=n;//求半支配点
for(int i=RG.H[x],v; i; i=RG.nxt[i])
if(dfn[v=RG.to[i]])
if(dfn[v]<dfn[x]) t=std::min(t,dfn[v]);
else Find(v), t=std::min(t,dfn[semi[mn[v]]]);
F[x]=fa[x], SG.AE(semi[x]=ref[t],x);
x=ref[k-1];//从半支配点到支配点
for(int i=SG.H[x],v; i; i=SG.nxt[i])
{
Find(v=SG.to[i]);
if(semi[v]==semi[mn[v]]) idom[v]=semi[v];
else idom[v]=mn[v];//idom[mn[v]]此时可能并未找到
}
}
for(int k=2,x; k<=n; ++k)
{
x=ref[k];
if(idom[x]!=semi[x]) idom[x]=idom[idom[x]];
T.AE(idom[x],x);
}
DFS(n,0);
for(int i=1; i<n; printf("%d ",Ans[i++]));
printf("%d\n",Ans[n]), memset(Ans,0,n+1<<2);
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1,u,v; i<=m; ++i) u=read(),v=read(),G.AE(u,v),RG.AE(v,u);
for(int i=1; i<=n; ++i) F[i]=semi[i]=mn[i]=i;
Index=0, DFS0(n), Solve(n);
G.Clear(n), RG.Clear(n), SG.Clear(n), T.Clear(n);
memset(dfn,0,n+1<<2), memset(idom,0,n+1<<2), memset(ref,0,n+1<<2);//, memset(fa,0,n+1<<2);//不都清空会RE啊==
}
return 0;
}
HDU.4694.Important Sisters(支配树)的更多相关文章
- [HDU]4694 Important Sisters(支配树)
支配树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- hdu 4694 Important Sisters【支配树】
求出支配树输出到father的和即可 支配树见:https://blog.csdn.net/a710128/article/details/49913553 #include<iostream& ...
- 【23.91%】【hdu 4694】Important Sisters("支NMLGB配树"后记)(支配树代码详解)
Time Limit: 7000/7000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission( ...
- HDOJ Important Sisters
Important Sisters Time Limit: 7000/7000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- 康复计划#4 快速构造支配树的Lengauer-Tarjan算法
本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...
- hdu 5517 Triple(二维树状数组)
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- [hdu4694]Important Sisters
来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一张图,求每个点到第n个点必须经过的点的编号之和.n<=50000 一道支配树裸题 然后统计答案的时候可以正着推,ans[i]=an ...
随机推荐
- 开始接触python
1.什么是语言? 语言是一个事物与另一个事物交流的介质 python是人与计算机交流的介质 能够被计算机所识别的表达方式即是编程语言 2.什么是编程? 编程就是程序员将想让计算机做的事情用编程语言表达 ...
- JSON数据写入和解析
如何写入JSON 需要第三方jar包,JSON包 //写入json数据 public static String sendJson() { JSONObject json = new JSONObje ...
- docker 给none镜像打镜像
1.遇到none的镜像打tag方式: docker tag + docker ID + 命名:版本名 案例:docker tag 41b7307026c0 gitlab:test 这就 ...
- GnuPGP介绍
PGP(Pretty Good Privacy的首字母):PGP公司的加密.签名工具套件,使用了商业版本的IDEA算法,并集成了有商业版权的PGPdisk工具. GnuPG(GNU Privacy G ...
- 步步为营-74-Request,Response和server的其他成员
Request 1 Request.UrlReferrer 获取请求的来源 2 Request.UserHostAddress 获取访问者的IP地址 3 Request.Cookies 获取浏览器发送 ...
- 无废话-API-01
说明 我的开发环境:VS2013 浏览器:谷歌浏览器(Google Chrome) 1创建项目 1.1添加一个 应用程序"ASP.NET MVC 4 Web 应用程序" 1.2选 ...
- mysql 5.7 安装
linux(CentOS6.7) 环境Mysql 5.7.17安装教程分享给大家,供大家参考,具体内容如下: 1系统约定 安装文件下载目录:/data/software Mysql目录安装位置:/us ...
- lsattr chattr 文件安全设置
[root@test_android_client_download xianlaigames]# lsattr -------------e- ./jilinmj.apk[root@test_and ...
- Hadoop ConnectException: Connection refused的一种解决办法
跟着视频学习天气案例,把代码敲好,准备提交运行时才发现集群没启动.然后在node02.node03.node04使用zkServer.sh start启动ZooKeeper,然后在node01使用st ...
- VS2017远程调试C#或 Visual Studio 中的 Visual Basic 项目
来源:远程调试C#或 Visual Studio 中的 Visual Basic 项目 若要调试已部署在另一台计算机的 Visual Studio 应用程序,安装和在其中部署您的应用程序的计算机上运行 ...