HDU

\(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(支配树)的更多相关文章

  1. [HDU]4694 Important Sisters(支配树)

    支配树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  2. hdu 4694 Important Sisters【支配树】

    求出支配树输出到father的和即可 支配树见:https://blog.csdn.net/a710128/article/details/49913553 #include<iostream& ...

  3. 【23.91%】【hdu 4694】Important Sisters("支NMLGB配树"后记)(支配树代码详解)

    Time Limit: 7000/7000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission( ...

  4. HDOJ Important Sisters

    Important Sisters Time Limit: 7000/7000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  5. HDU 5862 Counting Intersections(离散化+树状数组)

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  6. 康复计划#4 快速构造支配树的Lengauer-Tarjan算法

    本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...

  7. hdu 5517 Triple(二维树状数组)

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  8. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  9. [hdu4694]Important Sisters

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一张图,求每个点到第n个点必须经过的点的编号之和.n<=50000 一道支配树裸题 然后统计答案的时候可以正着推,ans[i]=an ...

随机推荐

  1. 开始接触python

    1.什么是语言? 语言是一个事物与另一个事物交流的介质 python是人与计算机交流的介质 能够被计算机所识别的表达方式即是编程语言 2.什么是编程? 编程就是程序员将想让计算机做的事情用编程语言表达 ...

  2. JSON数据写入和解析

    如何写入JSON 需要第三方jar包,JSON包 //写入json数据 public static String sendJson() { JSONObject json = new JSONObje ...

  3. docker 给none镜像打镜像

    1.遇到none的镜像打tag方式: docker  tag  + docker ID    + 命名:版本名 案例:docker  tag  41b7307026c0  gitlab:test 这就 ...

  4. GnuPGP介绍

    PGP(Pretty Good Privacy的首字母):PGP公司的加密.签名工具套件,使用了商业版本的IDEA算法,并集成了有商业版权的PGPdisk工具. GnuPG(GNU Privacy G ...

  5. 步步为营-74-Request,Response和server的其他成员

    Request 1 Request.UrlReferrer 获取请求的来源 2 Request.UserHostAddress 获取访问者的IP地址 3 Request.Cookies 获取浏览器发送 ...

  6. 无废话-API-01

    说明 我的开发环境:VS2013 浏览器:谷歌浏览器(Google Chrome) 1创建项目 1.1添加一个 应用程序"ASP.NET MVC 4 Web 应用程序"  1.2选 ...

  7. mysql 5.7 安装

    linux(CentOS6.7) 环境Mysql 5.7.17安装教程分享给大家,供大家参考,具体内容如下: 1系统约定 安装文件下载目录:/data/software Mysql目录安装位置:/us ...

  8. lsattr chattr 文件安全设置

    [root@test_android_client_download xianlaigames]# lsattr -------------e- ./jilinmj.apk[root@test_and ...

  9. Hadoop ConnectException: Connection refused的一种解决办法

    跟着视频学习天气案例,把代码敲好,准备提交运行时才发现集群没启动.然后在node02.node03.node04使用zkServer.sh start启动ZooKeeper,然后在node01使用st ...

  10. VS2017远程调试C#或 Visual Studio 中的 Visual Basic 项目

    来源:远程调试C#或 Visual Studio 中的 Visual Basic 项目 若要调试已部署在另一台计算机的 Visual Studio 应用程序,安装和在其中部署您的应用程序的计算机上运行 ...