tarjan算法的补充POJ2533tarjan求度
做题时又遇到了疑惑,说明一开始就没有完全理解
基于dfs的tarjan,搜索时会有四种边
树枝边:DFS 时经过的边,即 DFS 搜索树上的边
前向边:与 DFS 方向一致,从某个结点指向其某个子孙的边
后向边:与 DFS 方向相反,从某个结点指向其某个祖先的边
横叉边:从某个结点指向搜索树中另一子树中的某结点的边
Low(u)为 u 或 u 的子树( 经过最多一条后向边或栈中横叉边) 能够回溯到的最早的栈中结点的次序号。
Low(u)=Min
{
DFN(u),
Low(v),(u,v)为树枝边, u 为 v 的父结点
DFN(v),(u,v)为后向边或指向栈中结点的横叉边
}
所以做更新时要判断边的类别
这篇博客讲的很棒了
https://blog.csdn.net/qianguch/article/details/54710272
所以我在做这道题目的时候,对栈内栈外的没有考虑,所以出错了
- #include <iostream>
- #include <cstdio>
- #include <string.h>
- #define inf (1 << 30)
- using namespace std;
- const int maxn = 5500;
- const int maxm = 50500;
- struct node{
- int to,pre;
- }e[maxm];
- int dfn[maxn],low[maxn];
- int color[maxn],col;
- int id[maxn],cnt;
- int idx;
- int stk[maxn],s_cnt;
- int n,m;
- int out[maxn];
- bool instk[maxn];
- void init()
- {
- memset(id,-1,sizeof(id));
- memset(dfn,0,sizeof(dfn));
- memset(low,0,sizeof(low));
- memset(color,0,sizeof(color));
- memset(out,0,sizeof(out));
- memset(instk,0,sizeof(instk));
- col = idx = cnt = s_cnt = 0;
- }
- void add(int u,int v)
- {
- e[cnt].to = v;
- e[cnt].pre = id[u];
- id[u] = cnt++;
- }
- void tarjan(int u,int fa)
- {
- dfn[u] = low[u] = ++idx;
- stk[s_cnt++] = u;
- instk[u] = 1;
- for(int i = id[u];~i;i = e[i].pre)
- {
- int v = e[i].to;
- if(!dfn[v])
- {
- tarjan(v,u);
- low[u] = min(low[u],low[v]);
- }
- else if(instk[v])//此时表示已经更新过了
- {
- low[u] = min(low[u],dfn[v]);
- }
- }
- if(dfn[u] == low[u])
- {
- col++;
- while(s_cnt > 0 && stk[s_cnt] != u)
- {
- --s_cnt;
- color[stk[s_cnt]] = col;
- instk[stk[s_cnt]] = 0;
- }
- }
- }
- int main()
- {
- int u,v;
- while(~scanf("%d",&n),n)
- {
- scanf("%d",&m);
- init();
- for(int i = 1;i <= m;i++)
- {
- scanf("%d%d",&u,&v);
- add(u,v);
- }
- for(int i = 1;i <= n;i++)
- {
- if(!dfn[i])
- tarjan(i,-1);
- }
- for(int i = 1;i <= n;i++)
- {
- for(int j = id[i];~j;j = e[j].pre)
- {
- int to = e[j].to;
- if(color[i] != color[to])
- {
- ++out[color[i]];
- }
- }
- }
- bool flag = 1;
- for(int i = 1;i <= n;i++)
- {
- if(!out[color[i]])
- {
- if(flag)
- printf("%d",i),flag = 0;
- else
- printf(" %d",i);
- }
- }
- printf("\n");
- }
- return 0;
- }
tarjan算法的补充POJ2533tarjan求度的更多相关文章
- Tarjan算法打包总结(求强连通分量、割点和Tarjan-LCA)
目录 Tarjan打包总结(求强连通分量.割点和Tarjan-LCA) 强连通分量&缩点 原理 伪代码 板子(C++) 割点 原理 伪代码 最近公共祖先(LCA) 原理 伪代码 板子 Tarj ...
- tarjan算法-解决有向图中求强连通分量的利器
小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...
- tarjan算法+缩点:求强连通分量 POJ 2186
强连通分量:1309. [HAOI2006]受欢迎的牛 ★★ 输入文件:cow.in 输出文件:cow.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 每一头牛 ...
- [Tarjan系列] Tarjan算法求无向图的桥和割点
RobertTarjan真的是一个传说级的大人物. 他发明的LCT,SplayTree这些数据结构真的给我带来了诸多便利,各种动态图论题都可以用LCT解决. 而且,Tarjan并不只发明了LCT,他对 ...
- 图论-强连通分量-Tarjan算法
有关概念: 如果图中两个结点可以相互通达,则称两个结点强连通. 如果有向图G的每两个结点都强连通,称G是一个强连通图. 有向图的极大强连通子图(没有被其他强连通子图包含),称为强连通分量.(这个定义在 ...
- Tarjan算法初步
一.前置知识: 强连通分量:有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(stron ...
- [知识点]Tarjan算法
// 此博文为迁移而来,写于2015年4月14日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxnx.html UPD ...
- Tarjan算法 详解+心得
Tarjan算法是由Robert Tarjan(罗伯特·塔扬,不知有几位大神读对过这个名字) 发明的求有向图中强连通分量的算法. 预备知识:有向图,强连通. 有向图:由有向边的构成的图.需要注意的是这 ...
- Tarjan 算法 自学整理
算法介绍 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量( ...
随机推荐
- Python.Books
Flask 1. Flask Web Development Miguel Grinberg April 2014 2. Flask Framework Cookbook Shalabh Aggarw ...
- 谁说delphi没有IOCP库,delphi新的IOCP类库,开源中
DIOCP Demo说明 下载地址 https://code.google.com/p/diocp/ 特地为DIOCP开设了一个群:320641073,欢迎学习的IOCP的童鞋进入讨论. 核心作者: ...
- 拍照一分钟,修图两小时,PS大神是这样修片的!
乌克兰有一个叫Viktoria Solidarnyh的美图艺术家,这个艺术家有一个特别的技能——P图,她P的图,水平真的非常赞...来感受一下.... 瞬间变成魔幻田园风... 编辑:千锋UI设计 ...
- PHP图片处理库Grafika详细教程
转载自51CTO 开发频道 1.图像基本处理:http://developer.51cto.com/art/201611/520928.htm 2.图像特效处理模块:http://developer. ...
- 在vue中的点击事件怎么获取当前点击的元素
首先 vue的点击事件 是用 @click = “clickfun()” 属性 在html中绑定的,在点击的函数中 添加$event 参数就可以比如<button @click = “click ...
- Python3实战系列之四(获取印度售后数据项目)
问题:续接上一篇.说干咱就干呀,勤勤恳恳写程序呀! 目标:此篇开始进入正题了.为实现我们整个项目功能而开始实现各个子模块功能.首先实现第一篇列出的分步功能模块的第一步: 1.python访问ftp,下 ...
- ajax的基础
去年也是这个时候,开始学了ajax,也是这个技术领我走上了网页制作的道路,于是这样感觉到手写html比之前的dw拖拖拽拽要有意思得多. 话不多说,下面是一个例子: 这个是ajax显示页面:index. ...
- Tomcat优化详细1
在Tomcat和应用程序进行了压力测试后,如果您对应用程序的性能结果不太满意,就可以采取一些性能调整措施了,当然了前提是应用程序没有问题,我们这里只讲Tomcat的调整.由于Tomcat的运行依赖于J ...
- WCF 与 Windows Store Client App
首先复习下WCF: WCF实际上是构建了一个框架,这个框架实现了在互联系统中各个Application之间如何通信.使得Developers和Architect在构建分布式系统中,无需在考虑如何去实现 ...
- Python开课复习-10/17
pickle是一个用来序列化的模块序列化是什么?指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上 反序列化?将硬盘上存储的中间格式数据在还原为内存中的数据结构 为什么要序列化?就是为了将数据 ...