hdu 5452 Minimum Cut (LCA)
来源:互联网 发布:网络对人类认知优点 编辑:程序博客网 时间:2024/05/23 07:24
题目大意:给一个n个点,m条边的无环、无重边的无向图,并且给出图中的一棵生成树,求最小割边集大小,使得边集中恰好包含生成树中的一条边。
考虑生成树中的每一个结点,将其子树与其父节点分离需要去掉其父边以及其子树中的结点与其他子树相连的边,其父边就是生成树中的边,与其他子树相连的边为非生成树中的边。这样只需统计每一个子树关联的非生成树中的边数,取最小值,然后+1就是答案。
对于每一个结点i,设d[i]为结点i的子树关联的非生成树中的边数,则d[i]=sum(d[k]) k为i的子节点。
对于非生成树中的边的两个结点u,v,发现,除了lca(u,v),u到lca(u,v)以及v到lca(u,v)所经过的所有节点的d[i]都增加了1,因此处理每一条非生成树中的边的两个顶点u,v,d[u]++,d[v]++,d[lca(u,v)]-=2,然后DFS,回溯时自底向上更新一边d[i]的值即可。
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<stack>#include<cmath>#include<queue>#include<vector>using namespace std;#define maxn 20001struct Edge{ int to,next;} edge[400001];struct Querry{ int to,next;} Q[400001];int cnt,cnt2,head[maxn],d[maxn],head2[maxn];bool vis[maxn];int fa[maxn];int Find(int x){ if(fa[x]==x) return x; return fa[x]=Find(fa[x]);}void Union(int x,int y){ x=Find(x); y=Find(y); if(x==y) return; fa[y]=x;}inline void add1(int u,int v){ edge[cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt++;}inline void add2(int u,int v){ Q[cnt2].to=v; Q[cnt2].next=head2[u]; head2[u]=cnt2++;}void dfs(int u){ vis[u]=1; for(int i=head[u]; ~i; i=edge[i].next) { int v=edge[i].to; if(vis[v]) continue; dfs(v); Union(u,v); } for(int i=head2[u]; ~i; i=Q[i].next) { int v=Q[i].to; if(!vis[v]) continue; d[Find(v)]-=2; }}int ans;void DFS(int u){ vis[u]=1; for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].to; if(vis[v]) continue; DFS(v); d[u]+=d[v]; } if(u!=1) ans=min(ans,d[u]+1);}int main(){ int n,i,u,v,m,T; scanf("%d",&T); for(int ca=1; ca<=T; ++ca) { scanf("%d%d",&n,&m); for(i=0; i<=n; ++i) { head[i]=-1; head2[i]=-1; fa[i]=i; vis[i]=0; d[i]=0; } cnt=cnt2=0; for(i=1; i<n; ++i) { scanf("%d%d",&u,&v); add1(u,v); add1(v,u); } for(i=n; i<=m; ++i) { scanf("%d%d",&u,&v); add2(u,v); add2(v,u); d[u]++,d[v]++; } dfs(1); ans=0x3f3f3f3f; memset(vis,0,sizeof(vis)); DFS(1); printf("Case #%d: %d\n",ca,ans); } return 0;}
0 0
- 【LCA】HDU 5452Minimum Cut
- hdu 5452 Minimum Cut (LCA)
- HDU 5452 Minimum Cut(LCA+DFS)
- Minimum Cut (hdu 5452 离线LCA)
- HDU 5452 Minimum Cut 树链剖分 + LCA
- HDU 5452 Minimum Cut(LCA+树形DP)
- HDU 5452 Minimum Cut
- hdu 5452 Minimum Cut
- hdu 5452 Minimum Cut
- hdoj 5452 Minimum Cut 【LCA or 树链剖分】
- HDU 5452 Minimum Cut(LCA & RMQ & DFS)——2015 ACM/ICPC Asia Regional Shenyang Online
- HDU 5452 Minimum Cut 2015沈阳网络赛(在线LCA)
- hdu 5452 Minimum Cut(树链剖分)
- HDU 5631Minimum Cut-Cut
- HDU 5452 Minimum Cut(贪心)
- HDU 5452-C - Minimum Cut 树链剖分
- Smallest Minimum Cut HDU
- #HDU5452#Minimum Cut(LCA+树剖)
- 晒淘宝网技术内幕
- 开始写博客啦
- POJ 3352 Road Construction(边的双边通)
- php 装配mongo扩展
- 解决MYSQL 中文乱码
- hdu 5452 Minimum Cut (LCA)
- Android中进程间通信机制AIDL
- UI - UIImageViewAndSlider
- 使用Intent传递对象
- cocos2dx Button不是cocos2d::ui 的成员
- 关于重叠io完成例程中的sleepEx()
- 杭电4520小Q系列故事——最佳裁判
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项