hdu-4612(无向图缩点+树的直径)
题意:给你n个点和m条边的无向图,问你如果多加一条边的话,那么这个图最少的桥是什么
解题思路:无向图缩点和树的直径,用并查集缩点;
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxm=;
const int maxn=;
struct Edge
{
int next;int id;int to;
}edge[maxm];
int head[maxn],dist[maxn],f[maxn],low[maxn],dfn[maxn],visit[maxn];
int n,m,cnt,ans,step;
void init()
{
memset(dist,,sizeof(dist));
memset(visit,,sizeof(visit));
memset(head,-,sizeof(head));
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
for(int i=;i<=n;i++)
f[i]=i;
step=ans=cnt=;
}
int findf(int u)
{
if(u==f[u])
return u;
else
{
f[u]=findf(f[u]);
return f[u];
}
}
void join(int u,int v)
{
int t1=findf(u);int t2=findf(v);
if(t1!=t2)
f[t2]=t1;
}
void add(int u,int v,int id)
{
edge[cnt].next=head[u];edge[cnt].to=v;edge[cnt].id=id;head[u]=cnt++;
edge[cnt].next=head[v];edge[cnt].to=u;edge[cnt].id=id;head[v]=cnt++;
}
void tarjan(int u,int fa)
{
low[u]=dfn[u]=++step;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;int id=edge[i].id;
if(fa==id)
continue;
if(!dfn[v])
{
tarjan(v,id);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v])
{
ans++;
}
else
{
join(u,v);
}
}
else
{
low[u]=min(low[u],dfn[v]);
}
}
}
void bfs(int u)
{
visit[u]=;dist[u]=;
queue<int>q;
q.push(u);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(visit[v])
continue;
if(findf(x)==findf(v))
{
q.push(v);dist[v]=dist[x];visit[v]=;
}
else
{
q.push(v);dist[v]=dist[x]+;visit[v]=;
}
}
}
}
int main()
{
int x,y;
while(scanf("%d%d",&n,&m)&&n&&m)
{
init();
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y,i);
}
tarjan(,);
bfs();
int maxx=;int pos=;
for(int i=;i<=n;i++)
{
if(maxx<dist[i])
{
maxx=dist[i];pos=i;
}
}
memset(visit,,sizeof(visit));memset(dist,,sizeof(dist));
bfs(pos);
maxx=;
for(int i=;i<=n;i++)
{
if(maxx<dist[i])
maxx=dist[i];
}
printf("%d\n",ans-maxx);
}
}
hdu-4612(无向图缩点+树的直径)的更多相关文章
- F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解
题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...
- Hdu 4612 Warm up (双连通分支+树的直径)
题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...
- HDU 4612 Warm up tarjan 树的直径
Warm up 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 Description N planets are connected by ...
- hdu 4612 边连通度缩点+树的最长路径
思路:将以桥为分界的所有连通分支进行缩点,得到一颗树,求出树的直径.再用树上的点减去直径,再减一 #pragma comment(linker, "/STACK:1024000000,102 ...
- CodeForces - 1000E :We Need More Bosses(无向图缩点+树的直径)
Your friend is developing a computer game. He has already decided how the game world should look lik ...
- 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 (边双连通分量+缩点+树的直径)
<题目链接> 题目大意:给出一个连通图,问你在这个连通图上加一条边,使该连通图的桥的数量最小,输出最少的桥的数量. 解题分析: 首先,通过Tarjan缩点,将该图缩成一颗树,树上的每个节点 ...
- HDU4612:Warm up(缩点+树的直径)
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- HDU4612 Warm up 边双(重边)缩点+树的直径
题意:一个连通无向图,问你增加一条边后,让原图桥边最少 分析:先边双缩点,因为连通,所以消环变树,每一个树边都是桥,现在让你增加一条边,让桥变少(即形成环) 所以我们选择一条树上最长的路径,连接两端, ...
随机推荐
- 第一册:lesson 117.
原文:Tommy‘s breakfast. question:What' does she mean by 'change' in the last sentence. When my husband ...
- .Net 委托 delegate 学习
一.什么是委托: 委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递.委托是一种特殊类型的对象,其特殊之处在于委托中包含的只是一个活多个方法的地址,而不是数据. 二.使用委托: 关键 ...
- MVC开发模式简述
了解MVC开发模式,首先我们要了解一下发展趋势 一.什么是软件设计 Jack W.Reeves 于14年前(1992年),就在其撰写的论文——<What is Software Design&g ...
- VS code 设置中文后也显示英文的问题
按f1 搜索 Configore Display Language 设置 zh-cn 关闭软件重启. 如果重启菜单等还是英文的,在商店查看已安装的插件,把中文插件重新安装一遍,然后重启软件.
- Cookie 数据浅谈
Cookie 是一些数据, 存储于你电脑上的文本文件中. 当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息. Cookie 的作用就是用于解决 "如 ...
- arcgis api 3.x for js 入门开发系列十六迁徙流动图
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- QC API全系列揭秘之Test Execution操作(全网首发)
(原创文章,转载请注明出处.) 一.QC简介: Quality Center存在至今已经走过了10多个年头,名字从一开始的TD,到后来的QC,再到现在的ALM.所属公司从开始的Mercury到现在的H ...
- PO,VO,TO,BO,DAO,POJO的解释
java的(PO,VO,TO,BO,DAO,POJO)解释 O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定 ...
- VS code 中的各种变量 ${file},${fileBasename}
VS code 中的各种变量 ${file},${fileBasename} 2017年08月24日 11:14:07 bailsong 阅读数:7108 from: https://blog. ...
- win10下Resin安装--入门(1)
我个人采用是解压版的,直接解压亦可使用下载地址 开启该服务需要的环境:首先你的JDK必须安装成功 解压后你会看到 当我们运行程序时,需要修改配置文件中的相关配置: 1.端口:以免端口被占用 2.相应 ...