【HDU】5452 Minimum Cut(2015 ACM/ICPC Shenyang Online)
2016-07-10 20:40
423 查看
Minimum Cut
题目链接
Minimum Cut题目大意
给你一棵树和一些多余的边,现在要你删除若干条边,要求在树上只能删除一条边,使这棵树不联通。现在要求满足条件的最小删除边数。题解
LCA
在数上,a跟b如果有多余的边相连的话,除了删除a和b路径上的任意一条边以外,我们还要删除这条多余的边,所以我们先建树,然后对于每一条多余的边,我们在树上把a到b的路径每条边权值加一,最后统计所有边权的最小值。代码
#include <iostream> #include <cstring> #include <cstdio> #include <vector> using namespace std; int T,n,m,f[20005],d[20005],num[20005]; vector<int> G[20005]; void dfs(int u,int father,int depth) { f[u]=father; d[u]=depth; for (int i=0;i<G[u].size();i++) if (G[u][i]!=father) dfs(G[u][i],u,depth+1); } void LCA(int u,int v) { while (d[u]>d[v]) { num[u]++; u=f[u]; } while (d[v]>d[u]) { num[v]++; v=f[v]; } while (u!=v) { num[u]++; num[v]++; u=f[u]; v=f[v]; } } int main() { int Case=1; scanf("%d",&T); while (T--) { memset(f,0,sizeof(f)); memset(d,0,sizeof(d)); memset(num,0,sizeof(num)); for (int i=0;i<=20000;i++) G[i].clear(); int u,v; scanf("%d%d",&n,&m); for (int i=1;i<n;i++) { scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } dfs(1,0,0); for (int i=1;i<=m-n+1;i++) { scanf("%d%d",&u,&v); LCA(u,v); } int ans=0x7fffffff; for (int i=2;i<=n;i++) ans=min(ans,num[i]+1); printf("Case #%d: %d\n",Case++,ans); } return 0; }
相关文章推荐
- Mybatis缓存_7
- 1040. Longest Symmetric String (25)
- 拍照和从相册中选取照片,并保存到SD卡上
- sdk (软件开发工具包)
- linux - 理解inode
- JAVA中switch是否支持String类型参数?
- 使用 Native API 创建进程
- 关于akka的mailbox的size问题
- Python开发【第五篇】:Python基础之杂货铺
- 私人定制 博客地图 浏览次数 以及评论体系
- Spark Streaming揭秘 Day32 WAL框架及实现
- Android自定义View——仿ViVO X6 极速闪充动画效果
- 私人定制 博客地图 浏览次数 以及评论体系
- orcle 按年度 月度 汇总
- iOS中自定义输入文本框的cell(UITextFieldCell)的使用技巧
- Hdu 5326 Work(超水的树形DP)
- 1702 素数判定 2
- Python开发【第四篇】:Python基础之函数
- PS学习地址
- 实现 fizzBuzz 函数,参数 num 与返回值的关系如下: 1、如果 num 能同时被 3 和 5 整除,返回字符串 fizzbuzz 2、如果 num 能被 3 整除,返回字符串 fizz 3