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是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量( ...
随机推荐
- 搭建自己的代理服务 proxy nginx squid ss5 s(shadow)s(socks)
标签: nginx / squid / 负载均衡 / ss 4090 1. nginx (forward) nginx自己熟悉,经常用来做负载均衡的反向代理, 这里搭建一个正向代理(forward) ...
- iOS.Notification.Bar.Color
Reference: http://apple.stackexchange.com/questions/44246/what-determines-the-special-color-of-the-s ...
- Xstream将XML转换为javabean的问题
1.问题:Xstream is not security 解决方法:加上 2.问题:如果没有第二行代码,会出现xstream forbiddenclassexception 解决方法:加上第二行,其中 ...
- BZOJ1925或洛谷2467 [SDOI2010]地精部落
BZOJ原题链接 洛谷原题链接 先讲下关于波动数列的\(3\)个性质. 性质\(1\):对于数列中的每一对\(i\)和\(i + 1\),若它们不相邻,那么交换这两个数形成的依旧是一个波动数列. 性质 ...
- 【已处理完】Centos 6.5版本,df -h出来的容量与du -sh的容量不对应是怎么会事呢?
问题如题,df -h 出来的容量与du -sh 查看的容量信息不一样,是那里出了问题了吗? 下面分别是du -sh *与df -h出来的结果 [root@mail /]# du -sh * 6.2M ...
- 利用js代码:document.forms[0].approval.value='false',当点击 <input type="image"按钮向表单传递不同的参数。
<form action="flow_myTaskList"> <input type="hidden" name="approva ...
- js处理img标签加载图片失败,显示默认图片
1.第一种方法: 如果已经引入了jquery插件,就很好办.没有的话,如果实在需要,可以附上代码: script(type='text/javascript', src="http://aj ...
- android源码下载/查看地址
源码下载: http://git.omapzoom.org/ 高通平台android源码下载地址: https://www.codeaurora.org/xwiki/bin/QAEP/WebHome ...
- jQuery 2
<head > <style type="text/css"> /*table中偶数行*/ .tabEven { bac ...
- ubuntu16下的/etc/resolv.conf重置的解决方案
此文件存放了网络网关信息,重启后会刷新,刷新来源有两个可能 一个是根据文件中的resolvconf目录下的resolv.conf.d目录下的base文件 另一个来源是/etc/network/inte ...