【吃炸弹的鸽子UVA10765-双联通模板】
·从前有一个鸽子Lence,它吃了一个炸弹,然后有人出了这道题。
·英文题,述大意:
给出一张连通无向图,求出:对于每个点,删去这个点(以及它相连的边以后)时,当前图中的连通块数量,这个值作为该点的Lence值。输出根据Lence值从大到小(相同时标号从小到大)的前m个点和它的Lence值。
·分析:
关于连通块问题,可以寻得三种方法:
①嘎嘣脆算法(Gabow)②塔尔杨算法(Tarjan)③Kosaraju算法。
此处大米饼采用Tarjan算法。
·干什么呢?寻找并标记双连通分量。
在无向图中发现一个双连通分量(这里指边点连通分量)的意义:就算你任意吃掉一个点,这其中的点依然可以互相到达,也就是所谓的连通块。如果我们将一个图划分为多个双联通分量,就是这样:
·为了方便观赏,使用缩点操作。就是这样:
·所以,我们的方法是:根据点的位置进行分类处理。如果这个点不与桥连接,那么整个图还是联通的。如果该点和桥相连,那我们就猜一猜它和几座桥相连(不是猜,认真算!),那么它的毁灭会带来这些桥的毁灭,每一座桥的毁灭会使得一个双联通分量脱离原图,所以:如果这个点连接了num座桥,那么现在这个图就成了风雨飘荡中的(num+1)个部分。
·注意,在实际处理时,我们是用数组记录下每个点连接的桥的个数,所以如果这点不与桥相连,那么就是0,最终答案为0+1=1,因此不需要特殊处理。美妙的模板is drawing closer!
1 #include<stdio.h>
2 #include<algorithm>
3 #include<cstring>
4 #define go(i,a,b) for(int i=a;i<=b;i++)
5 #define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
6 #define mem(a,b) memset(a,b,sizeof(a))
7 using namespace std;const int N=10003;
8 struct E{int v,next;}e[N*100];struct A{int u,val;}ans[N];bool Cut[N];
9 int n,m,head[N],k,low[N],dfn[N],t,dfs_clock;
10 bool cmp(A a,A b){return a.val==b.val?a.u<b.u:a.val>b.val;}
11 void ADD(int u,int v){e[k]=(E){v,head[u]};head[u]=k++;}
12 void Tarjan(int u,int fa)
13 {
14 low[u]=dfn[u]=++dfs_clock;int num=0,kids=0;
15 fo(i,head,u)if(v!=fa){if(!dfn[v])
16 {
17 kids++;Tarjan(v,u);low[u]=min(low[u],low[v]);
18 if(dfn[u]<=low[v])num++,Cut[u]=1;}//错写成low[u]
19 else low[u]=min(low[u],dfn[v]);
20 }
21 if(!fa&&kids==1)Cut[u]=0,num=0;ans[++t]=(A){u,num};
22 }
23 int main(){while(scanf("%d%d",&n,&m)&&n)
24 {
25 mem(head,0);mem(low,0);mem(dfn,0);mem(Cut,0);t=dfs_clock=0;k=1;int u,v;
26 while(scanf("%d%d",&u,&v)&&++u&&++v)ADD(u,v),ADD(v,u);
27 go(i,1,n)if(!dfn[i])Tarjan(i,0);sort(ans+1,ans+t+1,cmp);
28 go(i,1,m)printf("%d %d\n",ans[i].u-1,ans[i].val+1);
29 puts("");}return 0;}//Paul_Guderian
让我,感到为难的,是挣扎的自由。————赵雷《成都》
【吃炸弹的鸽子UVA10765-双联通模板】的更多相关文章
- Tarjan总结(缩点+割点(边)+双联通+LCA+相关模板)
Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图 ...
- 大白书中无向图的点双联通分量(BCC)模板的分析与理解
对于一个无向图,如果任意两点至少存在两条点不重复(除起点和终点外无公共点)的路径,则这个图就是点双联通. 这个要求等价于任意两条边都存在于一个简单环(即同一个点不能在圈中出现两次)中,即内部无割点. ...
- poj 3177&&poj 3352加边构双联通(有重边)用tarjan 模板求的
#include<stdio.h>/* 求边双联通分量和求强连通差不多,先缩点求出叶子节点的个数 */ #include<string.h> #define N 5100 st ...
- hdu 3352 求边双联通分量模板题(容器)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h ...
- 无向图边双联通分量 tarjan 模板
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 500005 ...
- hdu 4738 (双联通求桥)
2013 ACM/ICPC Asia Regional Hangzhou Online 题目大意:有n个岛,曹操在一些岛之间建了一些桥,每个桥上有一些士兵把守,周瑜只有一个炸弹只能炸掉一个桥,炸弹需要 ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1) 有向图的强联通分量 (2) 无向图的双联通分量(求割点,桥) ...
- POJ3177 Redundant Paths【tarjan边双联通分量】
LINK 题目大意 给你一个有重边的无向图图,问你最少连接多少条边可以使得整个图双联通 思路 就是个边双的模板 注意判重边的时候只对父亲节点需要考虑 你就dfs的时候记录一下出现了多少条连向父亲的边就 ...
随机推荐
- 2017-2018-1 我爱学Java 第二周 作业
Android Game Discussion Questions Answers 20162309邢天岳 20162311张之睿 20162312张家铖 20162313苑洪铭 20162324春旺 ...
- 20145237《Java程序设计》实验报告一
实验一 Java开发环境的熟悉(Windows + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1 ...
- 深入分析Java Web中的编码问题
编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...
- jsp文件调用本地文件的方法(Tomcat server.xml 设置虚拟目录)
JSP文件: <video id="my-video" class="video-js" controls preload="auto" ...
- JS 转换数据类型
JavaScript 是一种动态数据类型语言,变量是没有类型的,可以随机赋予任意值,若变量要转换数据类型,有两种办法:隐式转换和显式转换. 隐式转换可转换为字符串(将一个值加上字符串) 数字(在值的前 ...
- JS 上传图片时实现预览
网页中一张图片可以这样显示: <img src="http://www.letuknowit.com/images/wg.png"/>也可以这样显示:<img s ...
- 20165226 2017-2018-4 《Java程序设计》第6周学习总结
20165226 2017-2018-4 <Java程序设计>第6周学习总结 教材学习内容总结 第八章 常用实用类 string类 并置 两个常量进行并置,得到的仍是常量. public ...
- Linux CentOS7.0 (04)systemctl vs chkconfig、service
CentOS 7.0中已经没有service命令,而是启用了systemctl服务器命令 systemctl 是系统服务管理器命令,它实际上将 service 和 chkconfig 这两个命令组合到 ...
- 新概念英语(1-13)A new dress
What colour is Anna's hat? A:What colour is your new dress? B:It's green.Come upstairs and see it. A ...
- Python学习之条件判断和循环
#coding= utf-8 # 条件判断和循环 # 如果if语句判断是True,就把缩进的两行print语句执行了,否则,什么也不做 age1 = 20 if age1 >= 18: prin ...