这几天一直在做强连通,现在总结一小下

1.定义

在一个有向图中,如果任意的两个点都是相互可达的,就说这个图是强连通的,有向图的极大强连通子图,称为强连通分量

2.求法

学的是白书上的tarjan算法

用到了DFS的时间戳

假设一个强连通分量C,其中的第一个点是 P,那么DFS下去,就一定能够找到一个K点,返回P点,这条DFS路径上的点就处于这个强连通分量C中

假如现在发现节点v,同时发现节点v最远只能够到达节点u,那么节点u就是这个强连通分量最先被发现的节点

这样就转化成了求一个点u最远能够到达的的祖先的d值

所以要定义一个low[]数组为节点u最早能够追溯到的祖先的pre[v]的值,pre[v]为节点v的时间戳

void dfs(int u){
low[u] = pre[u] = ++dfs_clock;
S.push(u);
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(!pre[v]){//子节点还没有被搜过,则搜下去,回溯回来更新low值
dfs(v);
low[u] = min(low[u],low[v]);
}
else if(!sc[v]) low[u] = min(low[u],pre[v]);//如果当前节点不属于其他scc,且已经被访问过,说明它是当前节点的祖先节点,直接用它的low更新
}
if(pre[u] == low[u]){
scnt++;
for(;;){
int x = S.top();S.pop();
sc[x] = scnt;
// scn[scnt]++;这里可以统计一个连通分量里面有多少个点,或者当点有点权的时候,算出这个连通分量的权值
if(x == u) break;
}
}
} void find_scc(){
while(!S.empty()) S.pop();
scnt = dfs_clock = ;
memset(low,,sizeof(low));memset(pre,,sizeof(pre));
memset(sc,,sizeof(sc));memset(scn,,sizeof(scn)); for(int i = ;i <= n;i++) if(!pre[i]) dfs(i);
}

3.现在做到的一些题目

现在做到的题目还是挺有限的,把自己做的总结下---以后遇到再补

(1)判断是否是一个强连通图

1)直接给一个有向图,判断是不是强连通的

hdu 1269

2) 附加一点限制的

加一个限制这个强连通分量里面的节点个数大于1的,tarjan算法里面直接再统计一下个数

poj 3180

( 2 )和入度出度有关的

1)加入几条边使得整个图强连通

白书上强连通那里的第一道例题

先tarjan,找出所有的强连通分量

再缩点,

再统计图的入度,出度,

另入度为0的有c1个,出度为0的有c2个,max(c1,c2)就是要求的

la 4287

hdu 2767

hdu 3836

这三道都是一样的

2)从哪些点出发,使得所有的点都能够走到

缩点,缩点后所有入度为0的就是要求的

hdu 1827 找入度为0的连通块,还附加了一个权值

poj 1236 max(c1,c2),和输出入度为0的连通分量的个数

poj 2553 统计出度为0的块

poj 2186 找有几个点是别的点都能够到达的,统计出度为0的块的个数c,

注意c > 1的情况,出度为0的块里面的点是相互不能够到达的,应该输出0

poj 2375 将图转化以后就是求max(c1,c2)

(3)和别的结合的

一般要用到缩点,缩完点之后形成一个有向无环图,构成一个DAG,

就可以dp,dfs,spfa

uva 11324

先求出所有强连通,再缩点,缩点完之后建立一个新的图

建图的办法是,扫一遍原来所有的边,如果发现这条边的两个端点u,v处在不同的连通分量中,就在sc[u],sc[v]之间连一条边

则转化成求DAG上权最大的路径

还可以有另一种办法

加一个源点进去,将这个源点与缩点完之后所有入度为0的点连一条边

再spfa求出权最大的路径

poj 3160和这题一样

poj 2762 缩点之后拓扑排序

poj 3114 缩点之后dijkstra,用floyd会t掉

poj 3592 图转化一下以后,spfa

现在就做了这些----

看的这两篇博客做得题目---

http://blog.csdn.net/accelerator_/article/details/40349411

http://blog.csdn.net/u013013910/article/category/2509879

Book---强连通分量的更多相关文章

  1. HDU5934 强连通分量

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5934 根据距离关系建边 对于强连通分量来说,只需引爆话费最小的炸弹即可引爆整个强连通分量 将所有的强连通分 ...

  2. POJ1236Network of Schools[强连通分量|缩点]

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16571   Accepted: 65 ...

  3. 有向图的强连通分量的求解算法Tarjan

    Tarjan算法 Tarjan算法是基于dfs算法,每一个强连通分量为搜索树中的一颗子树.搜索时,把当前搜索树中的未处理的结点加入一个栈中,回溯时可以判断栈顶到栈中的结点是不是在同一个强连通分量中.当 ...

  4. Tarjan算法--强连通分量

    tarjan的过程就是dfs过程. 图一般能画成树,树的边有三种类型,树枝边 + 横叉边(两点没有父子关系) + 后向边(两点之间有父子关系): 可以看到只有后向边能构成环,即只有第三张图是强连通分量 ...

  5. 强连通分量的一二三 | | JZOJ【P1232】 | | 我也不知道我写的什么

    贴题: 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之 ...

  6. 有向图强连通分量的Tarjan算法

    有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...

  7. poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)

    /* 题目大意:有N个cows, M个关系 a->b 表示 a认为b popular:如果还有b->c, 那么就会有a->c 问最终有多少个cows被其他所有cows认为是popul ...

  8. Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】

    一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...

  9. POJ 1236 Network of Schools(强连通分量/Tarjan缩点)

    传送门 Description A number of schools are connected to a computer network. Agreements have been develo ...

  10. 强连通分量的Tarjan算法

    资料参考 Tarjan算法寻找有向图的强连通分量 基于强联通的tarjan算法详解 有向图强连通分量的Tarjan算法 处理SCC(强连通分量问题)的Tarjan算法 强连通分量的三种算法分析 Tar ...

随机推荐

  1. 8 Mistakes to Avoid while Using RxSwift. Part 1

    Part 1: not disposing a subscription Judging by the number of talks, articles and discussions relate ...

  2. element合并单元格方法及遇到问题的解决办法

    效果如图: 代码如下 <!-- 查看选课 --> <template> <div> <el-table :data="listData" ...

  3. ASCII 码对照表

    ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 @ 96 . 1 SOH 33 ! 65 A 97 a 2 ST ...

  4. Spring环境搭建及简单demo

    1. Spring框架简介(以下这段话可用于面试求职) Spring为JavaEE开发提供了一个轻量级的解决方案,主要表现为, IOC(或者叫做DI)的核心机制,提供了bean工厂(Spring容器) ...

  5. PHP做的简单计算器

    使用php做的简易计算器 能够进行+,-,*,/运算. 如下图 <?php if (isset($_POST['button'])) { $num1 = $_POST['num1']; $num ...

  6. 做支付遇到的HttpClient大坑

    前言 HTTPClient大家应该都很熟悉,一个很好的抓网页,刷投票或者刷浏览量的工具.但是还有一项非常重要的功能就是外部接口调用,比如说发起微信支付,支付宝退款接口调用等:最近我们在这个工具上栽了一 ...

  7. FreeMarker 语法 include 引用模板

    一.java 代码 @Test public void testFreeMarker() throws Exception { //1.创建一个模板文件 //2.创建一个Configuration对象 ...

  8. 使用gson进行数据(集合数据)的转换 并且返回给前端 进行动态解析 并添加

    后台使用gson转换工具把list集合数据 以json字符串的方式返回给前台 解压: 加入到工程中 前台页面进行数据解析时  需要把得到的字符串  转换为object数组 -------------- ...

  9. RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第六篇【AppiumLibrary等待函数介绍】

    http://blog.csdn.net/deadgrape/article/details/50622441 废话不多说,少年们请看下面. Wait Until Page Contains text ...

  10. 03springMVC注解式控制器开发

    注解式控制器开发简介 注解式控制器开发HelloWorld HelloWorld的运行流程 处理器定义 REST简介 URL路径映射 数据绑定 不同的Model有相同的属性的处理 静态资源的处理 1  ...