求出支配树输出到father的和即可

支配树见:https://blog.csdn.net/a710128/article/details/49913553

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=300005;
int n,m,h[N],cnt,se[N],id[N],rl[N],fa[N],dfn[N],tot,f[N],v[N];
long long ans[N];
vector<int>p[N],d[N];
struct qwe
{
int ne,to;
}e[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
h[u]=cnt;
}
void dfs(int u)
{
dfn[u]=++tot;
rl[tot]=u;
for(int i=h[u];i;i=e[i].ne)
{
p[e[i].to].push_back(u);
if(!dfn[e[i].to])
{
fa[e[i].to]=u;
dfs(e[i].to);
}
}
}
int zhao(int x)
{
if(f[x]==x)
return x;
int fa=zhao(f[x]);
if(dfn[se[v[f[x]]]]<dfn[se[v[x]]])
v[x]=v[f[x]];
return f[x]=fa;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(h,0,sizeof(h));
memset(id,0,sizeof(id));
memset(dfn,0,sizeof(dfn));
memset(ans,0,sizeof(ans));
cnt=0;tot=0;
for(int i=1;i<=n;i++)
p[i].clear(),d[i].clear(),f[i]=v[i]=se[i]=i;
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y);
}
dfs(n);
for(int i=tot;i>=2;i--)
{
for(int j=0;j<p[rl[i]].size();j++)
{
if(dfn[p[rl[i]][j]]<dfn[rl[i]])
se[rl[i]]=(dfn[se[rl[i]]]<dfn[p[rl[i]][j]])?se[rl[i]]:p[rl[i]][j];
else
{
zhao(p[rl[i]][j]);
se[rl[i]]=(dfn[se[rl[i]]]<dfn[se[v[p[rl[i]][j]]]])?se[rl[i]]:se[v[p[rl[i]][j]]];
}
}
f[rl[i]]=fa[rl[i]];
d[se[rl[i]]].push_back(rl[i]);
for(int j=0;j<d[fa[rl[i]]].size();j++)
{
zhao(d[fa[rl[i]]][j]);
id[d[fa[rl[i]]][j]]=(dfn[se[v[d[fa[rl[i]]][j]]]]<dfn[se[d[fa[rl[i]]][j]]])?v[d[fa[rl[i]]][j]]:fa[rl[i]];
}
}
for(int i=2;i<=tot;i++)
if(id[rl[i]]!=se[rl[i]])
id[rl[i]]=id[id[rl[i]]];
for(int i=1;i<=n;i++)
ans[i]=0;
for(int i=1;i<=tot;i++)
{
ans[rl[i]]+=rl[i];
if(id[rl[i]])
ans[rl[i]]+=ans[id[rl[i]]];
}
for(int i=1;i<n;i++)
printf("%lld ",ans[i]);
printf("%lld\n",ans[n]);
}
return 0;
}

hdu 4694 Important Sisters【支配树】的更多相关文章

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

    HDU \(Description\) 给定一张简单有向图,起点为\(n\).对每个点求其支配点的编号和. \(n\leq 50000\). \(Solution\) 支配树. 还是有点小懵逼. 不管 ...

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

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

  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. 多线程(C++)临界区Critical Sections

    一 .Critical Sections(功能与Mutex相同,保证某一时刻只有一个线程能够访问共享资源,但是不是内核对象,所以访问速度比Mutex快,但是没有等待超时的功能,所以有可能导致死锁,使用 ...

  2. cmake中的变量和命令的大小写

    1 cmake中要特别注意命令和变量的大小写 2 cmake的内置命令是不区分大小写的 3 cmake内置变量是区分大小写的,或者干脆就说,cmake的所有变量都是区分大小写的 这就是变量和命令的不同 ...

  3. Transforming Auto-encoders

    http://www.cs.toronto.edu/~hinton/absps/transauto6.pdf The artificial neural networks that are used ...

  4. windows IDA 调试SO

    还是参考了网上的很多资料,感谢这些前辈的分享. ===================================================================== 环境:win ...

  5. 函数----Function对象

    函数---Function对象 一 .  函数的书写 函数 : 就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 函数的作用 : ● 将大量重复的语句写在函数里,以后需要这些语句的时候,可以 ...

  6. c# 获取当前行的位置信息

    StackTrace st = new StackTrace(new StackFrame(true)); StackFrame sf = st.GetFrame(0); //文件位置 Console ...

  7. DB2删除表分区

    近日,由于部门数据库读库空间过小,提出删除掉两个月之前日志表的分区(数据库分区是按时间月分区),记述如下: 上网搜索资料发现删除表分区大概分这么几步: 1.查询需要删除掉的分区: select t.D ...

  8. 【C】论‘\r’和'\n'的纯粹性

  9. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  10. POJ 3104 Contestants Division

    Contestants Division Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10597   Accepted:  ...