Gym - 100712H Bridges(边—双连通分量)
https://vjudge.net/problem/Gym-100712H
题意:
给出一个图,求添加一条边后最少的桥数量。
思路:
参考了ZSQ大神的题解http://blog.csdn.net/v5zsq/article/details/61922051
很明显的边—双连通的题目,首先缩点建新图。然后寻找树中的最大直径,这样就能将桥的数量减至最小。
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- #include<vector>
- #include<queue>
- #include<cmath>
- #include<map>
- #include<stack>
- using namespace std;
- const int maxn=+;
- struct Edge
- {
- int to,next;
- bool flag;//标记是否是桥
- }edge[maxn*];
- stack<int> S;
- int n,m;
- int head[maxn],tot;
- int low[maxn],dfn[maxn],belong[maxn];
- int index,top;
- int block;//边双连通块数
- bool instack[maxn];
- int bridge;//桥的数目
- int e[maxn][];
- int deep; //最长直径
- int pos; //最长直径端点
- void addedge(int u,int v)
- {
- edge[tot].to=v,edge[tot].next=head[u],edge[tot].flag=;
- head[u]=tot++;
- }
- void Tarjan(int u,int pre)
- {
- int v;
- low[u]=dfn[u]=++index;
- S.push(u);
- instack[u]=;
- for(int i=head[u];~i;i=edge[i].next)
- {
- v=edge[i].to;
- if(v==pre)continue;
- if(!dfn[v])
- {
- Tarjan(v,u);
- if(low[u]>low[v])low[u]=low[v];
- if(low[v]>dfn[u])
- {
- bridge++;
- edge[i].flag=;
- edge[i^].flag=;
- }
- }
- else if(instack[v]&&low[u]>dfn[v])
- low[u]=dfn[v];
- }
- if(low[u]==dfn[u])
- {
- block++;
- do
- {
- v=S.top(); S.pop();
- instack[v]=;
- belong[v]=block;
- }
- while(v!=u);
- }
- }
- void init()
- {
- memset(dfn,,sizeof(dfn));
- index=block=top=bridge=tot=;
- memset(head,-,sizeof(head));
- }
- //邻接表寻找树的直径
- void dfs(int u,int fa,int cnt)
- {
- if(cnt>deep) {deep=cnt;pos=u;}
- for(int i=head[u];~i;i=edge[i].next)
- {
- int v=edge[i].to;
- if(v!=fa) dfs(v,u,cnt+);
- }
- }
- int main()
- {
- //freopen("D:\\input.txt","r",stdin);
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&m);
- init();
- for(int i=;i<=m;i++)
- {
- scanf("%d%d",&e[i][],&e[i][]);
- addedge(e[i][],e[i][]);
- addedge(e[i][],e[i][]);
- }
- Tarjan(,);
- //缩点,重建图
- tot=;
- memset(head,-,sizeof(head));
- int ans=;
- for(int i=;i<=m;i++)
- {
- int u=belong[e[i][]], v=belong[e[i][]];
- if(u!=v)
- {
- ans++;
- addedge(u,v);
- addedge(v,u);
- }
- }
- deep=;
- dfs(,,);
- deep=;
- dfs(pos,pos,);
- printf("%d\n",ans-deep);
- }
- return ;
- }
Gym - 100712H Bridges(边—双连通分量)的更多相关文章
- zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
- hdoj 4738 Caocao's Bridges【双连通分量求桥】
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Gym - 100676H H. Capital City (边双连通分量缩点+树的直径)
https://vjudge.net/problem/Gym-100676H 题意: 给出一个n个城市,城市之间有距离为w的边,现在要选一个中心城市,使得该城市到其余城市的最大距离最短.如果有一些城市 ...
- HDU 4738 双连通分量 Caocao's Bridges
求权值最小的桥,考虑几种特殊情况: 图本身不连通,那么就不用派人去了 图的边双连通分量只有一个,答案是-1 桥的最小权值是0,但是也要派一个人过去 #include <iostream> ...
- POJ3352 Road Construction(边双连通分量)
...
- POJ3352 Road Construction (双连通分量)
Road Construction Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- HDU 4612 Warm up(2013多校2 1002 双连通分量)
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- POJ3352 Road Construction 双连通分量+缩点
Road Construction Description It's almost summer time, and that means that it's almost summer constr ...
随机推荐
- 为golang程序使用pprof远程查看httpserver运行堆栈,cpu耗时等信息
pprof是个神马玩意儿? pprof - manual page for pprof (part of gperftools) 是gperftools工具的一部分 gperftools又是啥? Th ...
- SKBUFFER详解
纯属转载,不敢侵犯别人产权!! 一. SKB_BUFF的基本概念1. 一个完整的skb buff组成(1) struct sk_buff--用于维护socket buffer状态和描述信息(2) he ...
- sVIrt概述
sVirt概述 前面已经对seLInux的基本原理做了分析,seLinux主要就是基于主体和客体的安全上下文,进行访问决策.那么安全上下文是不是又可以理解为一个标签呢? 基于以上seLInux的特性, ...
- Python 开发中高级技巧
列表推导式 >>> chars = [ c for c in 'python' ] >>> chars ['p', 'y', 't', 'h', 'o', 'n'] ...
- Git Extension工具安装及使用
以下界面所示的三个工具,如果没安装过,则勾上让其安装.MsysGit为Git的Windows版本,必须要安装:Kdiff为对比/合并工具,可选安装,可以换为使用其它的相关工具:最后一个Windows ...
- myeclipse自动设置类和方法的注释(快捷键)
类的注释 第一步:找到Window→Preferences→Java→Code Style→Code Templates→Comments→Types 第二步:编辑Pattern,我一般用的模板 /* ...
- volatile变量,java内存模型
volatile变量提供了最轻量级的同步机制,当一个变量加上volatile修饰时,会具有一下两个特性 https://blog.csdn.net/u011277123/article/details ...
- Spark SQL中UDF和UDAF
转载自:https://blog.csdn.net/u012297062/article/details/52227909 UDF: User Defined Function,用户自定义的函数,函数 ...
- 更新表中数据可以使用join
1.在修改数据库的时候,每写完一条SQL语句都要加上一个分号,这样每句之间是有依赖关系的,上面执行不成功不会执行下面的语句. 2.在更新数据库中数据时可以使用join. 例如: update res ...
- webService 总结
Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...