博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4694 Important Sisters 支配树
阅读量:4982 次
发布时间:2019-06-12

本文共 2858 字,大约阅读时间需要 9 分钟。

题目大意

给定一个n个点m条边的有向图,以n为源点.对于一个点u,求在所有n->u的路径上都出现的点的编号之和.

n <= 50000,m <= 1000000

题解

终于有时间来学支配树了。

支配树裸题,直接用支配树模板去搞就好了。
关于支配树,我正在写这个ppt
写好了我把链接发到这个博客上有想看的可以看
(不知不觉,一个大坑)
UPD : 课件写好了,想要看的可以私信~~

#include 
#include
#include
#include
using namespace std;typedef long long ll;inline void read(int &x){ x=0;static char ch;static bool flag;flag = false; while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true; while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;}#define rg register int#define rep(i,a,b) for(rg i=(a);i<=(b);++i)#define per(i,a,b) for(rg i=(a);i>=(b);--i)const int maxn = 50010;const int maxm = 100010;struct Graph{ struct Edge{ int to,next; }G[maxm]; int head[maxn],cnt; void clear(){ memset(head,0,sizeof head); cnt = 0; } void add(int u,int v){ G[++cnt].to = v; G[cnt].next = head[u]; head[u] = cnt; }}ori,inv,nwg;int ufa[maxn],pos[maxn],ido[maxn],sdo[maxn];int find(int x){ if(x == ufa[x]) return ufa[x]; int r = find(ufa[x]); if(sdo[pos[ufa[x]]] < sdo[pos[x]]) pos[x] = pos[ufa[x]]; return (ufa[x] = r);}inline int eval(int x){ find(x);return pos[x];}int n,m,dfn[maxn],seq[maxn],dfs_clock;int fa[maxn];void dfs(int u){ dfn[u] = ++ dfs_clock; seq[dfs_clock] = u; sdo[u] = dfs_clock; for(int i = ori.head[u],v;i;i = ori.G[i].next){ v = ori.G[i].to; if(dfn[v]) continue; fa[v] = u; dfs(v); }}int sum[maxn];void dfs(int u,int f){ for(rg i = nwg.head[u],v;i;i=nwg.G[i].next){ v = nwg.G[i].to; if(v == f) continue; sum[v] = sum[u] + v; dfs(v,u); }}vector
ve[maxn];int main(){ while(scanf("%d%d",&n,&m) != EOF){ rep(i,1,n) ufa[i] = i,pos[i] = i; ori.clear();inv.clear();nwg.clear(); rep(i,1,n) ve[i].clear(),dfn[i] = seq[i] = ido[i] = sdo[i] = sum[i] = fa[i] = 0; dfs_clock = 0; int u,v; rep(i,1,m){ read(u);read(v); ori.add(u,v); inv.add(v,u); } dfs(n); per(id,dfs_clock,2){ u = seq[id]; for(int i = inv.head[u];i;i=inv.G[i].next) if(dfn[inv.G[i].to]) sdo[u] = min(sdo[u],sdo[eval(inv.G[i].to)]); ve[seq[sdo[u]]].push_back(u); int f = fa[u];ufa[u] = fa[u]; for(vector
::iterator it = ve[f].begin();it != ve[f].end();++it){ int x = eval(*it); ido[*it] = sdo[*it] == sdo[x] ? f : x; }ve[f].clear(); } rep(i,2,dfs_clock) u = seq[i],ido[u] = ido[u] == seq[sdo[u]] ? ido[u] : ido[ido[u]]; rep(i,1,n-1) nwg.add(ido[i],i);sum[n] = n; dfs(n,n); rep(i,1,n){ printf("%d",sum[i]); if(i != n) putchar(' '); else putchar('\n'); } } return 0;}

转载于:https://www.cnblogs.com/Skyminer/p/6800007.html

你可能感兴趣的文章
flask-信号
查看>>
Spring-Cloud的版本是如何定义的
查看>>
传入class、id name 的函数封装
查看>>
软工网络15团队作业3——需求分析与设计
查看>>
python 类对象和实例对象动态添加方法
查看>>
【转】C#生成验证码
查看>>
Linux环境下JDK/Eclipse一键安装脚本
查看>>
HwUI,CMS管理系统模板,漂亮,简单,兼容好
查看>>
特意给我的轩写的小知识
查看>>
LibreOJ #2003. 「SDOI2017」新生舞会
查看>>
sublime text there are no packages available for installation 解决办法
查看>>
Piston Pump Manufacturers - Mobile Cartridge Piston Pump: Advantages
查看>>
我喜欢的几款不错的vim插件
查看>>
eclipse在ubuntu13.04下崩溃crash
查看>>
wpf 右键ListBox可编辑
查看>>
hihocoder offer收割编程练习赛11 C 岛屿3
查看>>
maven+springmvc项目启动时,request mapping not found……
查看>>
提高JetBrains软件的性能
查看>>
ASP.NET:MVC中文件上传与地址变化处理
查看>>
Python 单向链表、双向链表
查看>>