HDU4612 Warm up 边双(重边)缩点+树的直径
题意:一个连通无向图,问你增加一条边后,让原图桥边最少
分析:先边双缩点,因为连通,所以消环变树,每一个树边都是桥,现在让你增加一条边,让桥变少(即形成环)
所以我们选择一条树上最长的路径,连接两端,这样减少的桥边,最多,所以就是求树的直径
注:这题有重边,所以边双缩点也需要用重边版的
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <stack>
using namespace std;
typedef long long LL;
const int N = 2e5+;
int head[N],tot,n,cnt,m,x[N*],y[N*];
struct Edge{
int v,next;
}edge[N*];
void add(int u,int v){
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int dfn[N],low[N],clk,bel[N],d[N];
stack<int>s;
void targin(int u,int f){
dfn[u]=low[u]=++clk;
s.push(u);
bool flag=;//判断重边
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(v==f&&!flag){
flag=;//记录重边出现次数,只跳过父边第一次出现
continue;
}
if(!dfn[v]){
targin(v,u);
low[u]=min(low[u],low[v]);
}
else if(dfn[v]<low[u])low[u]=dfn[v];
}
if(dfn[u]==low[u]){
++cnt;
int k;
do{
k=s.top();
s.pop();
bel[k]=cnt;
}while(k!=u);
}
}
int S,tmp,ans;
void dfs1(int u,int f){
d[u]=d[f]+;
if(d[u]>tmp){
tmp=d[u];
S=u;
}
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(v==f)continue;
dfs1(v,u);
}
}
void dfs2(int u,int f){
d[u]=d[f]+;
ans=max(ans,d[u]);
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(v==f)continue;
dfs2(v,u);
}
}
int main(){
d[]=-;
while(~scanf("%d%d",&n,&m)){
if(!n&&!m)break;
for(int i=;i<=n;++i){
head[i]=-;
dfn[i]=low[i]=;
}
cnt=clk=tot=;
for(int i=;i<=m;++i){
scanf("%d%d",&x[i],&y[i]);
add(x[i],y[i]),add(y[i],x[i]);
}
targin(,-);
if(cnt<=){
printf("0\n");
continue;
}
for(int i=;i<=cnt;++i)head[i]=-;
tot=;
for(int i=;i<=m;++i){
int k1=bel[x[i]],k2=bel[y[i]];
if(k1==k2)continue;
add(k1,k2),add(k2,k1);
}
tmp=ans=;
dfs1(,);
dfs2(S,);
printf("%d\n",cnt--ans);
}
return ;
}
HDU4612 Warm up 边双(重边)缩点+树的直径的更多相关文章
- hdu4612 Warm up[边双连通分量缩点+树的直径]
给你一个连通图,你可以任意加一条边,最小化桥的数目. 添加一条边,发现在边双内是不会减少桥的.只有在边双与边双之间加边才有效.于是,跑一遍边双并缩点,然后就变成一棵树,这样要加一条非树边,路径上的点( ...
- HDU 4612 Warm up (边双连通分量+缩点+树的直径)
<题目链接> 题目大意:给出一个连通图,问你在这个连通图上加一条边,使该连通图的桥的数量最小,输出最少的桥的数量. 解题分析: 首先,通过Tarjan缩点,将该图缩成一颗树,树上的每个节点 ...
- hdu 4612 Warm up 有重边缩点+树的直径
题目链接 Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tot ...
- hdu 4612 Warm up 双连通缩点+树的直径
首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...
- hdu4612(双连通缩点+树的直径)
传送门:Warm up 题意:询问如何加一条边,使得剩下的桥的数目最少,输出数目. 分析:tarjan缩点后,重新建图得到一棵树,树上所有边都为桥,那么找出树的直径两个端点连上,必定减少的桥数量最多, ...
- F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解
题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...
- Gym - 100676H H. Capital City (边双连通分量缩点+树的直径)
https://vjudge.net/problem/Gym-100676H 题意: 给出一个n个城市,城市之间有距离为w的边,现在要选一个中心城市,使得该城市到其余城市的最大距离最短.如果有一些城市 ...
- HDU-4612 Warm up 边双连通分量+缩点+最长链
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 简单图论题,先求图的边双连通分量,注意,此题有重边(admin还逗比的说没有重边),在用targ ...
- HDU-4612 Warm up,tarjan求桥缩点再求树的直径!注意重边
Warm up 虽然网上题解这么多,感觉写下来并不是跟别人竞争访问量的,而是证明自己从前努力过,以后回头复习参考! 题意:n个点由m条无向边连接,求加一条边后桥的最少数量. 思路:如标题,tarjan ...
随机推荐
- Solr + Hadoop = Big Data Love
FROM:http://architects.dzone.com/articles/solr-hadoop-big-data-love 许多人使用Hadoop的开源项目来处理大数据的大数据集,因为它是 ...
- office2010 office2013打开个别PPT时需要修复的解决方法
写在前面的废话(请直接查看正文部分):一次意外之后,需要重装Microsoft office,于是屁颠屁颠就重装了一次MS office 2013,装好后发现,打开个别ppt/pptx时打不开,提示修 ...
- 解决position:relative情况下,z-index无效的方法
在实际开发中,div+css经常会碰到层级的问题 其中有个很头痛的就是z-index控制层级时,老是发现z-index不起作用 老杨依据自己的经验,总结出以下步骤: 1.判断被覆盖的层(想要置顶的层) ...
- 【数位DP】Hdu 2089:不要62
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Spring MVC Checkbox And Checkboxes Example
In Spring MVC, <form:checkbox /> is used to render a HTML checkbox field, the checkbox values ...
- WinDbg调试DMP格式文件
前言:WinDbg是微软开发的免费源代码级的调试工具.WinDbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件.本文的讨论是在安装了Debugging Tools for Win ...
- linux bash_profile和.bashrc区别
经常在一些技术类的文章中提到修改bash_profile和.bashrc这两个文件,也算是使用频率比较高的两个文件吧,但实现同样一个功能,有的教程里说修改bash_profile这个文件,有的教程里却 ...
- 李洪强iOS开发本人集成环信的经验总结_08_自动登录补充
李洪强iOS开发本人集成环信的经验总结_08_自动登录补充 来到Appdelegate里面 01 - 遵守自动登录的代理协议 02 - 设置自动登录的代理 03 - 判断与实现 04 - 代理方法的 ...
- 使用intellij idea搭建MAVEN+springmvc+mybatis框架
原文:使用intellij idea搭建MAVEN+springmvc+mybatis框架 1.首先使用idea创建一个maven项目 2.接着配置pom.xml,以下为我的配置 <projec ...
- 217. Contains Duplicate
题目: Given an array of integers, find if the array contains any duplicates. Your function should retu ...