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. poj3070 单位矩阵(转移矩阵构造)+矩阵快速幂

    太妙了..通过矩阵乘法来加速递推 #include<iostream> #include<cstring> #include<cstdio> using names ...

  2. cf1025c 思维题

    /* bwwwbwwbw wwbwwwbwb 不管从哪里断开翻转.翻转后的串再整体翻转一定是2s的子串 */ #include<bits/stdc++.h> using namespace ...

  3. numpy 与 pandas

    numpy: import numpy as np np.array([1,2,3]) 创建数组 np.arange(10).reshape(2,5) 类似于range(起始,终止,步长),可以加re ...

  4. add web server(nginx)

    #!/bin/bash # # Web Server Install Script # Last Updated 2012.09.24 # ##### modify by WanJie 2012.09 ...

  5. C/C++内存管理器

    C标准库提供了malloc,free,calloc,realloc,C++标准库还提供了new, new[], delete, delete[].这些用来管理内存,看起来够用了,为啥还要自己写一个内存 ...

  6. IDEA上创建 Maven SpringBoot项目发布到Tomcat

    概述 上篇记录了IDEA上创建Maven SpringBoot+mybatisplus+thymeleaf 项目,但是如何将SpringBoot发布到Tomcat,直接采用Maven 命令Clear- ...

  7. mysql中cast() 和convert()的用法讲解

    一.在mysql操作中我们经常需要对数据进行类型转换.此时我们应该使用的是cast()或convert(). 二.两者的对比 相同点:都是进行数据类型转换,实现的功能基本等同 不同点:两者的语法不同, ...

  8. rxjs简单入门

    rxjs全名Reactive Extensions for JavaScript,Javascript的响应式扩展, 响应式的思路是把随时间不断变化的数据.状态.事件等等转成可被观察的序列(Obser ...

  9. input时间表单默认样式修改(input[type="date"])

    一.时间选择的种类: HTML代码:选择日期:<input type="date" value="2018-11-15" /> 选择时间:<i ...

  10. 034 Maven中的dependencyManagement和dependencies区别

    这个标签使用过,但是具体的描述还是没有说明过.在这里,专门查了一下,写了这篇文章. 1.定义 在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管 ...