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. bzoj 4007

    非常好的树形dp 首先,有个很显然的状态:记状态f[i][j]表示以i为根节点的子树中选了j个叶节点作战,那么很显然有转移:f[i][j1+j2]=f[i<<1][j1]+f[i<& ...

  2. MySQL5.7.20安装过程报错CMake Error at cmake/boost.cmake:81 (MESSAGE):

    MySQL在5.7版本及以后,都需要boots 库,所以需要先安装boots 步骤: 1.在/usr/local下创建 名为boots的目录 mkdir -p /usr/local/boots 2.进 ...

  3. selenium 无法启动IE

    解决办法是IE选项设置的安全页中,4个区域的启用保护模式的勾选都去掉(或都勾上)

  4. windows下Qt播放flash

    Qt  版本:5.1.0 32bit 代码部分,参考1即可.配置发行时,需要将NPSWF32放在项目的plugins\目录中. 否则,可能找不到,导致无法运行. QWebSettings *setti ...

  5. B: Ocean的游戏(前缀和)

    B: Ocean的游戏 Time Limit: 1 s      Memory Limit: 128 MB Submit My Status Problem Description 给定一个字符串s, ...

  6. 卸载win10内置的onenote

    powershell命令如下 get-appxpackage *onenote* | remove-appxpackage

  7. 挂在光盘出现写保护mount: block device /dev/sr0 is write-protected, mounting read-only

    https://blog.csdn.net/yueludanfeng/article/details/60339688

  8. QQ登录用到的URL

    //QQ 登陆页面的URL,client_id就是APP ID,会返回一个codehttps://graph.qq.com/oauth2.0/authorize?response_type=code& ...

  9. [转] mongoDB与mongoose

    mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的 ...

  10. [转] 简述js中 for in 与 for of 区别

    for in是ES5标准,遍历key. for of是ES6标准,遍历value. for (var key in arr){ console.log(arr[key]); } for (var va ...