hdu 5452 Minimum Cut 求最小割边集的大小
来源:互联网 发布:nginx 404 编辑:程序博客网 时间:2024/06/05 10:44
题意:给定图G的一颗生成树,然后求最小割边集的大小,要求割边集中要有且仅有一条生成树边
考虑给定的生成树,求出要把某个子树和其父节点分开的最少割边数,然后枚举除了
转换为求将每个子树要分开的最小割边。就是求这颗子树连接到子树外的边的数量。
如果一条边
并且
//author: CHC//First Edit Time: 2015-09-19 19:43#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std;typedef long long LL;const int MAXN=20000 + 1000;const int MAXM=200000*2 + 10000;const int INF = numeric_limits<int>::max();const LL LL_INF= numeric_limits<LL>::max();struct Edge { int to,next,flag; Edge(){} Edge(int _to,int _next,int _flag):to(_to),next(_next),flag(_flag){}}e[MAXM];int head[MAXN],tot;void init(){ memset(head,-1,sizeof(head)); tot=0;}void AddEdge(int u,int v,int flag){ e[tot]=Edge(v,head[u],flag); head[u]=tot++; e[tot]=Edge(u,head[v],flag); head[v]=tot++;}int fa[MAXN][22],dep[MAXN];void dfs(int u,int father){ fa[u][0]=father; for(int i=1;i<=20;i++)fa[u][i]=fa[fa[u][i-1]][i-1]; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(e[i].flag&&!dep[v]){ dep[v]=dep[u]+1; dfs(v,u); } }}int lca(int a,int b){ if(dep[a]<dep[b])swap(a,b); int x=dep[a]-dep[b],y=0; while(x){ if(x&1)a=fa[a][y]; x>>=1; ++y; } if(a==b)return a; for(int i=20;i>=0;i--){ if(fa[a][i]!=fa[b][i]){ a=fa[a][i]; b=fa[b][i]; } } return fa[a][0];}int ans[MAXN],delta[MAXN];void dfs1(int u,int father){ ans[u]=delta[u]=0; //printf("u:%d\n",u); //system("pause"); for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; //printf("%d-->%d %d\n",u,v,e[i].flag); if(e[i].flag){ //printf("%d:%d\n",v,father); if(v!=father){ //printf("%d-->%d\n",u,v); //printf("v:%d\n",v); dfs1(v,u); //printf("%d:%d\n",u,ans[v]); ans[u]+=ans[v]; } } else { ans[u]++; //printf("before:\n"); ans[lca(u,v)]--; //printf("after:\n"); } } //printf("%d\n",ans[u]);}int main(){ int T,n,m,cas=0; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); init(); for(int i=0,x,y;i<m;i++){ scanf("%d%d",&x,&y); AddEdge(x,y,(i<(n-1))); //printf("%d-->%d %d\n",x,y,i<(n-1)); } dep[1]=1; dfs(1,1); dfs1(1,1); //printf("here"); //for(int i=1;i<=n;i++)printf("%d %d\n",i,ans[i]); //puts(""); int minn=INF; for(int i=2;i<=n;i++)minn=min(minn,ans[i]+1); printf("Case #%d: %d\n",++cas,minn); } return 0;}/**/
0 0
- hdu 5452 Minimum Cut 求最小割边集的大小
- HDU 6214 Smallest Minimum Cut(求最小割的最少边数)
- HDU 5452 Minimum Cut
- hdu 5452 Minimum Cut
- hdu 5452 Minimum Cut
- HDU 6214 Smallest Minimum Cut(最小割的最少割边数)
- hdu Smallest Minimum Cut 边数最少的最小割
- HDU 6214 Smallest Minimum Cut 【最小割】
- HDU-6214 Smallest Minimum Cut(最小割)
- 【LCA】HDU 5452Minimum Cut
- hdu 5452 Minimum Cut (LCA)
- hdu 5452 Minimum Cut(树链剖分)
- HDU 6214 Smallest Minimum Cut (最小割最小割边)(两种算法的分析)
- HDU 6214 Smallest Minimum Cut【最小割的最小边数】
- poj 2914 Minimum Cut 求无向图的最小割 Stoer-Wagner算法模板
- POJ 2914 Minimum Cut //无向图求最小割
- HDU6214 Smallest Minimum Cut 【最大流求最小割边】
- hdu-6214 Smallest Minimum Cut(最小割的最少边)
- JAVA科学计数法转普通计数法
- shell 脚本学习笔记-1 终端打印 变量 环境变量
- 个人代码管理
- java笔记1
- Effective C++——条款46(第7章)
- hdu 5452 Minimum Cut 求最小割边集的大小
- 日志-eye track
- HTML(网页设计)基础到加强
- 二叉树遍历(前序、中序、后序)递归与非递归
- Python编程学习——装饰器
- 正则表达式:
- 基于HSI颜色模型实现去除照片的“红眼现象”
- 散列表链接法用双向链表的原因
- 转圈打印二维数组