GYM 100712 H.Bridges(边双连通分量)
来源:互联网 发布:gta5官网mac版下载 编辑:程序博客网 时间:2024/05/14 20:45
Description
给出一个n个点m条边的无向图,要求新加一条边使得加完边后的新图的桥最少
Input
第一行一整数T表示用例组数,每组用例首先输入两整数n和m分别表示点数和边数,之后m行每行两个整数u和v表示u和v之间有一条边(1<=T<=64,3<=n<=1e5,n-1<=m<=1e5)
Output
输出加一条边后最少的桥数
Sample Input
Sample Output
1
0
Solution
Tarjan缩点,对缩完点的树求一遍直径,连接直径的两个端点减少的桥数最多,原先的桥数减去直径长度即为答案
Code
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 111111#define maxm 222222 struct Edge{ int to,next; bool flag;//标记是否是桥}edge[maxm];int head[maxn],tot;int low[maxn],dfn[maxn],stack[maxn],belong[maxn];//belong数组的值是1~blockint index,top;int block;//边双连通块数bool instack[maxn];int bridge;//桥的数目void addedge(int u,int v){ edge[tot].to=v,edge[tot].next=head[u],edge[tot].flag=0; head[u]=tot++;}void Tarjan(int u,int pre){ int v; low[u]=dfn[u]=++index; stack[top++]=u; instack[u]=1; 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=1; edge[i^1].flag=1; } } else if(instack[v]&&low[u]>dfn[v]) low[u]=dfn[v]; } if(low[u]==dfn[u]) { block++; do { v=stack[--top]; instack[v]=0; belong[v]=block; } while(v!=u); }}void init(){ memset(dfn,0,sizeof(dfn)); memset(stack,0,sizeof(stack)); index=block=top=bridge=tot=0; memset(head,-1,sizeof(head));}int T,n,m,e[maxn][2],deep,pos;int 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)continue; dfs(v,u,cnt+1); }}int main(){ scanf("%d",&T); while(T--) { init(); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&e[i][0],&e[i][1]); addedge(e[i][0],e[i][1]),addedge(e[i][1],e[i][0]); } Tarjan(1,1); init(); int ans=0; for(int i=1;i<=m;i++) { int u=belong[e[i][0]],v=belong[e[i][1]]; if(u!=v) ans++,addedge(u,v),addedge(v,u); } deep=0; dfs(1,1,0); deep=0; dfs(pos,pos,0); printf("%d\n",ans-deep); } return 0;}
0 0
- GYM 100712 H.Bridges(边双连通分量)
- ZOJ2588.Burning Bridges——边双连通分量,桥
- 边双连通分量
- Gym 100712H Bridges
- hdu 2242(边双连通分量)
- uva 10972(边双连通分量)
- UVA 10972(边双连通分量)
- poj3352Road Construction(边双连通分量)
- 双连通分量(点+边)
- 【HDU】4738 Caocao's Bridges 双连通分量
- 点-双连通分量&边-双连通分量复习笔记
- 边双连通分量模版
- HDU4738【边双连通分量】
- 边双连通分量模板
- 双连通分量(DCC)
- hdu4738(双连通分量)
- poj 3177 边双连通分量(处理重边)
- uva 10972 - RevolC FaeLoN(边双连通分量)
- solr4.9.0入门solrj调用solrAPI
- python matplotlib如何将图例放在图外
- MacOS常用软件
- 以下两个关于webservice.
- 分布电容对小信号的干扰解决方案
- GYM 100712 H.Bridges(边双连通分量)
- wampserver搭建站点 允许外网访问的设置方法
- 快乐工作室旗下应用隐私政策
- Eclipse中使用SVN检出项目遇到的问题
- jquery 将某个字符全部替换 replace
- PowerDesiger 15逆向生成工程E-R图及导出word表格
- sky3888 Deposit Dark Side Devil's Delight Slot Game
- 利用Java内置锁与并发包多线程交替打印字符串
- java.lang.NoClassDefFoundError: com.umeng.analytics.MobclickAgent 解决方法