HDU 5452 Minimum Cut(LCA)
http://acm.hdu.edu.cn/showproblem.php?pid=5452
题意:
有一个连通的图G,先给出图中的一棵生成树,然后接着给出图中剩余的边,现在要删除最少的边使得G不连通,并且在生成树中必须且只能删除一条边。
思路:
最简单的情况是G就是给出的生成树,这种情况下删除任何一条边都可以。
枚举每一条树边,如果该边的子节点没有非树边,那么删除这条边就可以使图非连通,如果有非树边,那么就要把非树边删去,当然,子节点之内的非树边不用删,要删的是连出去的非树边。
这样一来,对每个顶点记录非树边的度数,表示要删除的情况,但是如果在一棵子树内怎么办呢?此时就会多算,求得它们的lca,在该顶点上度数-2,也就是减去这条边。最后dfs一遍即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = +; int n,m,tot,Log,ans;
int head[maxn],degree[maxn],deep[maxn];
int p[maxn][],cut[maxn]; struct node
{
int v,next;
}e[*+]; void addEdge(int u, int v)
{
e[tot].v = v;
e[tot].next = head[u];
head[u] = tot++;
} void dfs(int u, int fa, int d)
{
deep[u]=d;
p[u][]=fa;
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].v;
if(v==fa) continue;
dfs(v,u,d+);
}
} void init()
{
for(int j=;j<=Log;j++)
for(int i=;i<=n;i++)
p[i][j]=p[p[i][j-]][j-];
} int LCA(int x, int y)
{
if(x==y) return x;
if(deep[x]<deep[y]) swap(x,y);
for(int i=Log;i>=;i--)
{
if(deep[p[x][i]]>=deep[y])
x=p[x][i];
}
if(x==y) return x;
for(int i=Log;i>=;i--)
{
if(p[x][i]!=p[y][i])
{
x=p[x][i];y=p[y][i];
}
}
return p[x][];
} void solve(int u, int fa)
{
cut[u] = degree[u];
for(int i=head[u];i!=-;i=e[i].next)
{
int v = e[i].v;
if(v==fa) continue;
solve(v,u);
cut[u]+=cut[v];
}
ans = min(ans, cut[u]);
} int main()
{
//freopen("in.txt","r",stdin);
int T;
int kase = ;
scanf("%d",&T);
while(T--)
{
tot = ;
memset(head,-,sizeof(head));
memset(degree,,sizeof(degree));
scanf("%d%d",&n,&m);
for(int i=;i<=n-;i++)
{
int u,v;
scanf("%d%d",&u,&v);
addEdge(u,v);
addEdge(v,u);
} dfs(,-,);
for(Log=;(<<Log)<=n+;Log++);
Log--;
init(); for(int i=;i<=m-n+;i++)
{
int u,v;
scanf("%d%d",&u,&v);
degree[u]++;
degree[v]++;
int lca = LCA(u,v);
degree[lca] -= ;
} ans = 0x3f3f3f3f;
solve(,-);
printf("Case #%d: %d\n",++kase,ans+);
}
return ;
}
HDU 5452 Minimum Cut(LCA)的更多相关文章
- HDU 5452 Minimum Cut (Spaning Tree)
生成树的上的一个非根结点对应一条生成树上的边,然后这个结点的子树上连出去的边就对应去掉这条边的割, 然后就可以对树外的边求LCA,在LCA上标记,利用这个信息可以算出有多少条边在子树上,以及有多少条边 ...
- Hdu 5452 Minimum Cut (2015 ACM/ICPC Asia Regional Shenyang Online) dfs + LCA
题目链接: Hdu 5452 Minimum Cut 题目描述: 有一棵生成树,有n个点,给出m-n+1条边,截断一条生成树上的边后,再截断至少多少条边才能使图不连通, 问截断总边数? 解题思路: 因 ...
- hdu 5452 Minimum Cut 树形dp
Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...
- HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】
Minimum Cut Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Tota ...
- HDU 5452 Minimum Cut
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5452题目大意: 给你一个图G,图中包含一颗生成树.要求只能删除生成树内的一条边,使得图不联通.问最小的删除 ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- 洛谷P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...
- HDU 5775 Bubble Sort(冒泡排序)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- 图论--最近公共祖先问题(LCA)模板
最近公共祖先问题(LCA)是求一颗树上的某两点距离他们最近的公共祖先节点,由于树的特性,树上两点之间路径是唯一的,所以对于很多处理关于树的路径问题的时候为了得知树两点的间的路径,LCA是几乎最有效的解 ...
随机推荐
- JDK8的新特性
- LDA模型了解及相关知识
什么是LDA? LDA是基于贝叶斯模型的,涉及到贝叶斯模型离不开“先验分布”,“数据(似然)”和"后验分布"三块.贝叶斯相关知识:先验分布 + 数据(似然)= 后验分布. 贝叶斯模 ...
- maven 入门 (二)
上一篇写了,怎么在在项目中用到maven,怎么安装maven及创建maven工程. 现在的话说一下怎么使用maven来下载jar包,呵呵.和maven的一些配置. 打开maven-config-set ...
- Javascript原生之用cssText批量修改样式
一般情况下我们用js设置元素对象的样式会使用这样的形式: var element= document.getElementById(“id”);element.style.width=”20px”;e ...
- POJ 1182 食物链 (种类并查集)
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种.有人用两种说 ...
- 设置PyCharm创建文件时自动添加头文件
找到该路径并添加以下信息 File->settings->Editor->File and Code Templates->Python Script #!/usr/bin/ ...
- Charles 从入门到精通 --转
文章目录 1. 目录及更新说明 2. Charles 限时优惠 3. 简介 4. 安装 Charles 5. 将 Charles 设置成系统代理 6. Charles 主界面介绍 7. 过滤网络请求 ...
- Golang字符串函数认识(二)
package main import ( "fmt" "strings" ) func main(){ //返回字符在指定字符串中最后一次出现的位置 last ...
- jQuery中prop和attr区别
问题 今天给一个button加onclick事件,由于最后button根据需要转成字符串,因此不能使用jQurey.click(),只能给button添加onclick属性的方式. 于是,$butto ...
- visual studio 2015下使用gcc调试linux c++开发环境搭建完整详解
一直以来,相信绝大部分的开发都是windows/mac下做开发,尤其是非嵌入式和qt系的,而开源服务器程序绝大部分都是跑在Linux下,几乎就没有跑在windows下的.一直以来开发人员都是在wind ...