【吃炸弹的鸽子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的时候记录一下出现了多少条连向父亲的边就 ...
随机推荐
- Swift 2.2 的新特性
导读:本文来自SwiftGG翻译组,作者@walkingway基于苹果Swift官方博客中Ted Kremenek所撰写的"Swift 2.2 Released!"文章进行了关于S ...
- 将Excel上千条数据写入到数据库中
简要说明:因工作需要,需要一张Excel表格中的所有数据导入到数据库中.如下表,当然这只是一部分,一共一千多条. 前期处理: 首先要保证上图中的Excel表格中的数据不能为空,如果有为空的数据,可以稍 ...
- centos系统升级PHP版本程序
鉴于Centos 默认yum源的php版本太低了,手动编译安装又有点一些麻烦,那么如何采用Yum安装的方案安装最新版呢.那么,今天我们就来学习下如何用yum安装php最新版. 1.检查当前安装的PHP ...
- ashx页面怎么调用Handler的Session
aspx里面直接可以用Session["Name"]进行赋值和取值,ashx中就得继承接口IRequiresSessionState.然后使用! 实现: public class ...
- canvas绘制圆心扇形可组成颜色随机的七色小花
啊~现在应该还是春天吧.心情一如既往的烦闷呐.最近做了一个canvas的扇形绘制的东西.把它整理出来变成一个适合春天的花朵绘制~沉闷的工作环境已经让我这种有趣的人也变成了无聊鬼怪呢.下次一定想找一个年 ...
- Java 并发编程:Callable和Future
项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable实现. import java ...
- 部署上次的Hapi到Windows+Docker,WindowsDocker
前言: 理论的就不多说了,具体的架构看图.web这里是上篇文章开发的Hapi服务,数据库Mysql,废话不多说,粗略的画了下,架构图如下: Mysql镜像拉取,配置 数据库镜像查找 docker se ...
- leetcode 566 Reshape the Matrix 重塑矩阵
参考:https://www.cnblogs.com/grandyang/p/6804753.html 注意:复习容器的定义方法?? class Solution { public: vector&l ...
- [LeetCode] Non-decreasing Array 非递减数列
Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...
- QueryRunner--常见方法
数据库链接池的使用,一方面解决了数据库访问过多时造成数据库承受的压力,另一方面也简化了数据查询,今天就 DBUtils包所提供的QueryRunner类(org.apache.commons.dbut ...