P5180 【模板】支配树
这个题乱七八糟的,和之前的灭绝树有点像,但是不一样。那个是DAG,这个是有向图。简单步骤就是先求出来dfs序,然后求出半支配点(?),然后通过这个求支配点。
算法不是很理解,先放在这。
题干:
题目背景 模板题,无背景
题目描述 给定一张有向图,求从1号点出发,每个点能支配的点的个数(包括自己)
输入输出格式
输入格式: 第一行两个正整数n,mn,mn,m,表示点数和边数 接下来mmm行,每行输入两个整数u,vu,vu,v,表示有一条uuu到vvv的有向边 输出格式: 一行输出nnn个整数,表示每个点能支配的点的个数
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
const int N = 1e6 + ;
int dfn[N],n,m;
struct node
{
int l,r,nxt;
}a[N << ],b[N << ],c[N << ];
int len = ,len1 = ,lst[N],pre[N],len2 = ,lat[N];
void add(int x,int y)
{
a[++len].l = x;
a[len].r = y;
a[len].nxt = lst[x];
lst[x] = len;
}
void dda(int x,int y)
{
b[++len1].l = x;
b[len1].r = y;
b[len1].nxt = pre[x];
pre[x] = len1;
}
void add1(int x,int y)
{
c[++len2].l = x;
c[len2].r = y;
c[len2].nxt = lat[x];
lat[x] = len2;
}
int sdom[N],bel[N],id[N],val[N],cnt = ;
int fa[N],tot = ,idom[N];
void dfs(int now)
{
dfn[now] = ++cnt;
id[cnt] = now;
for(int k = lst[now];k;k = a[k].nxt)
{
int y = a[k].r;
if(dfn[y]) continue;
dfs(y);
fa[y] = now;
}
}
int find(int x)
{
if(x == bel[x]) return x;
int root = find(bel[x]);
if(dfn[sdom[val[bel[x]]]] < dfn[sdom[val[x]]])
val[x] = val[bel[x]];
return bel[x] = root;
}
/*int find(int x)
{
if(x==bel[x]) return x;
int root=find(bel[x]);
if(dfn[sdom[val[bel[x]]]]<dfn[sdom[val[x]]])
val[x]=val[bel[x]];
return bel[x]=root;
}*/
void tarjan()
{
for(int i = cnt;i >= ;i--)
{
int now = id[i];
for(int k = pre[now];k;k = b[k].nxt)
{
int y = b[k].r;
if(!dfn[y]) continue;
find(y);
if(dfn[sdom[val[y]]] < dfn[sdom[now]])
sdom[now] = sdom[val[y]];
}
add1(sdom[now],now);
bel[now] = fa[now];
now = fa[now];
for(int k = lat[now];k;k = c[k].nxt)
{
int v = c[k].r;
find(v);
if(sdom[val[v]] == now) idom[v] = now;
else idom[v] = val[v];
}
}
for(int i = ,now;i <= cnt;i++)
{
now = id[i];
if(idom[now] != sdom[now])
idom[now] = idom[idom[now]];
}
}
int ans[N];
void dfs_ans(int now)
{
ans[now] = ;
for(int k = lst[now];k;k = a[k].nxt)
{
int y = a[k].r;
dfs_ans(y);
ans[now] += ans[y];
}
}
int main()
{
read(n);read(m);
duke(i,,m)
{
int x,y;
read(x);read(y);
add(x,y);dda(y,x);
}
duke(i,,n)
{
sdom[i] = bel[i] = val[i] = i;
}
dfs();
tarjan();
len = ;
clean(lst);
for(int i = ;i <= n;i++)
if(idom[i]) add(idom[i],i);
dfs_ans();
duke(i,,n)
{
printf("%d ",ans[i]);
}
return ;
}
P5180 【模板】支配树的更多相关文章
- [HDU]4694 Important Sisters(支配树)
支配树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- P5180-[模板]支配树
正题 题目链接:https://www.luogu.com.cn/problem/P5180 题目大意 给出\(n\)个点的一张有向图,求每个点支配的点数量. \(1\leq n\leq 2\time ...
- P3384 【模板】树链剖分
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- 洛谷P3368 【模板】树状数组 2
P3368 [模板]树状数组 2 102通过 206提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 如题,已知一个数列,你需要进行下面两 ...
- 洛谷P3374 【模板】树状数组 1
P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两 ...
- hdu 1754 I Hate It (模板线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others) M ...
- 康复计划#4 快速构造支配树的Lengauer-Tarjan算法
本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...
- luogu3384 【模板】树链剖分
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- luogu2597-[ZJOI2012]灾难 && DAG支配树
Description P2597 [ZJOI2012]灾难 - 洛谷 | 计算机科学教育新生态 Solution 根据题意建图, 新建一个 \(S\) 点, 连向每个没有入边的点. 定义每个点 \( ...
- HDU.4694.Important Sisters(支配树)
HDU \(Description\) 给定一张简单有向图,起点为\(n\).对每个点求其支配点的编号和. \(n\leq 50000\). \(Solution\) 支配树. 还是有点小懵逼. 不管 ...
随机推荐
- 导出功能在数据库内容为数字,excel表格中是汉字的时候
代码如下: @ExcelField(title = "饮水器评价",dictType = "waterer_rate" ,align = 2, sort = 2 ...
- vue启动
首先在终端terminal连上npm 镜像库 npm config set registry https://registry.npm.taobao.orgnpm installnpm run loc ...
- mysql外键是多个id组成的字符串,查询方法
借鉴:mysql使用instr达到in(字符串)的效果 结论:select * from 表名where INSTR(CONCAT(字符串),CONCAT(表id)) 问题来源:一表中的某字段是另一表 ...
- 【2018百度之星资格赛】 A 问卷调查 - 位运算&动规
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6344 参考博客:在此感谢http://www.cnblogs.com/LQLlulu/p/941923 ...
- 洛谷——P2659 美丽的序列
P2659 美丽的序列 单调栈维护区间最小值,单调递增栈维护区间最小值, 考虑当前数对答案的贡献,不断加入数,如果加入的数$>$栈顶,说明栈顶的元素对当前数所在区间是有贡献的,同时加入当前的数. ...
- Python学习笔记(3)动态类型
is运算符 ==是值相等而is必须是相同的引用才可以 l=[1,2,3] m=[1,2,3] print(l==m) # True print(l is m) # False sys模块 getref ...
- IN语句改写EXISTS
-- IN SELECT T1.* FROM role_menu T1 WHERE T1.ROLEUUID IN ( SELECT T2.uuid FROM role T2 WHERE T2.UUID ...
- MySQL6
MySQL数据库6 1. 集群概述 性能达到瓶颈的解决方案 Scale Up 向上扩展能力,如增加更好的硬件固态磁盘,加大内存等,成本高,效果不显著 Scale Out 向外扩展,例如建立更多的服务器 ...
- LINUX-文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消
ls -lh 显示权限 ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 chmod ugo+rwx directory1 设置目录的所有人(u).群组(g)以及其他人(o ...
- 【模板】大数乘法(51nod 1027)
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long #defin ...