[BZOJ1123][POI2008]BLO(tarjan求点双+树形dp)
来源:互联网 发布:伴知旅行网 编辑:程序博客网 时间:2024/06/07 17:46
题目描述
传送门
题目大意:给出一个n个点m条边的无向连通图,问去掉每一个点之后存在多少点对不连通。
题解
tarjan求点双联通分量,对于每一个点双建立一个虚拟的节点,然后将这个点双的所有节点都连接到这个节点上,这样就形成了一棵树的结构
容易知道这道题求的应该是去掉每一个点之后形成的联通块的每一个大小,然后利用乘法原理计算一下,所以建出树了之后dp一下就行了
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define LL long long#define N 1000005int n,m,dfs_clock,top,dcc;int tot,point[N],nxt[N],v[N];int dfn[N],low[N],stack[N];bool vis[N];LL ans[N];struct data{ int tot,point[N],nxt[N],v[N]; int size[N]; void add(int x,int y) { ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; } void treedp(int x,int fa) { if (x<=n) size[x]=1; for (int i=point[x];i;i=nxt[i]) if (v[i]!=fa) { treedp(v[i],x); ans[x]+=size[x]*size[v[i]]; size[x]+=size[v[i]]; } ans[x]+=(LL)size[x]*(n-size[x]); }}tr;void add(int x,int y){ ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}void tarjan(int x){ dfn[x]=low[x]=++dfs_clock;vis[x]=1;stack[++top]=x; for (int i=point[x];i;i=nxt[i]) if (!dfn[v[i]]) { tarjan(v[i]); low[x]=min(low[x],low[v[i]]); if (dfn[x]<=low[v[i]]) { int now=0;++dcc; while (now!=v[i]) { now=stack[top--]; vis[now]=0; tr.add(dcc+n,now); } tr.add(dcc+n,x); } } else if (vis[v[i]]) low[x]=min(low[x],dfn[v[i]]);}int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=m;++i) { int x,y;scanf("%d%d",&x,&y); add(x,y),add(y,x); } tarjan(1); tr.treedp(1,0); for (int i=1;i<=n;++i) printf("%lld\n",ans[i]*2);}
0 0
- [BZOJ1123][POI2008]BLO(tarjan求点双+树形dp)
- bzoj1123 [POI2008]BLO(tarjan求割点)
- bzoj 1123: [POI2008]BLO (tarjan求点双+树形DP)
- 【bzoj1123】【[POI2008]BLO】tarjan判割点
- BZOJ 1123 POI2008 BLO Tarjan+树形DP
- 【bzoj1123】[POI2008]BLO
- BZOJ1123: [POI2008]BLO
- BZOJ1123: [POI2008]BLO
- BZOJ1123: [POI2008]BLO
- BZOJ1123 BLO(tarjan割点)
- 【BZOJ1123】[POI2008]BLO【割顶】
- BZOJ1123 BLO [Tarjan][点双连通分量]
- 【tarjan】【bzoj 1123】: [POI2008]BLO
- 1123: [POI2008]BLO tarjan求割点
- bzoj1123 BLO
- BZOJ 1123: [POI2008]BLO tarjan求割点
- BOZJ 1123: [POI2008]BLO tarjan求割点
- BZOJ 1123: [POI2008]BLO 点双联通,Tarjan求割点
- 放在一起(头文件)一般只是考虑外部调用的情况,仅此而已
- 每天一个小题目——日期倒计时
- Material Design之侧滑菜单DrawerLayout+NavigationView的使用
- 【codeforces猎题记录】【题解口胡】【不定时更新】
- android 自定义view之继承(四)
- [BZOJ1123][POI2008]BLO(tarjan求点双+树形dp)
- iOS多线程-各种线程锁的简单介绍
- 检查web项目中重复的jar
- 数据结构 八大排序算法
- 01-复杂度1 最大子列和问题 (20分) c++ && python
- Notification的用法
- html和jsp的区别--静态页面和动态页面的区别
- macOS Sierra打开任何来源
- Java中实现文件上传下载的三种解决方案 之二