博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tarjan(缩点)
阅读量:5244 次
发布时间:2019-06-14

本文共 1097 字,大约阅读时间需要 3 分钟。

刚做了两道tarjan缩点的题,新学的算法总结一下。

推荐题:(难度单调递增)

第四题算法是tarjan+spfa求最长路,我刚刚写了一篇题解,链接在这里:

如果不会最短路点击:

总结:tarjan 简单来说 算法过程 就是找环或单独的点,这就可以构成强联通分量。

代码如下:

void tarjan(int u){    low[u]=dfn[u]=++cnt;    stk[++top]=u;    vis[u]=1;    for(register int i=head[u];i;i=edge[i].next){        int v=edge[i].to;        if(!dfn[v]){            tarjan(v);            low[u]=min(low[u],low[v]);        }        else        if(vis[v])        low[u]=min(low[u],dfn[v]);    }    if(dfn[u]==low[u]){        co[u]=++col;        vis[u]=0;        while(stk[top]!=u){        vis[stk[top]]=0;        co[stk[top]]=col;        top--;        }        top--;    }}

缩点也很简单,根据col重新建个图就行了。

 

tarjan缩点题的一些特征和突破口:

 

1.一般tarjan缩点的题会给你具有传递性的图,利用传递性可以省略掉一些点,例如:如果a喜欢b,b喜欢c,那么a就喜欢c。假设c又喜欢a,这就可以构成一个强连通分量,缩点即可,没错,这就是“受欢迎的牛”。

 

2.点的入度和出度是很重要的,很多题就围绕这这个东西去变式,关注点的入度和出度,往往会找到突破口。

 

3.有的题需要记录一些强连通分量内的数据

(1)可以在同一强连通分量中的点出栈的过程中更新,这样比较方便简单。

 

(2)也可以在主程序中再次for循环去更新,那样就比较麻烦了,时间复杂度和空间复杂度都得增加,然而我第一次打这类题就是这么操作的,代码不短。

 

反思:还是理解不够深,我的tarjan总是打错一点,然后又去修改,还是得多模拟一下tarjan缩点的过程。

 

最大的收获:发现自己tarjan一直是打错了,但是不知道为何做题却不出错,现在更改过来了。

转载于:https://www.cnblogs.com/sky-zxz/p/9664520.html

你可能感兴趣的文章
sgu 109 Magic of David Copperfield II
查看>>
C++循环单链表删除连续相邻重复值
查看>>
IIS 7.5 + PHP-5.6.3 + mysql-5.6.21.1(转载)
查看>>
渣渣小本求职复习之路每天一博客系列——Java基础(3)
查看>>
C#调用WIN32 的API函数--USER32.DLL
查看>>
ListView下拉刷新实现
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
【7集iCore3基础视频】7-4 iCore3连接示意图
查看>>
ASP.NET使网页弹出窗口不再困难
查看>>
Leetcode Balanced Binary Tree
查看>>
Day1:Spring-IoC、DI
查看>>
Leetcode 92. Reverse Linked List II
查看>>
TensorFlow2-维度变换
查看>>
Redux源码分析之createStore
查看>>
POJ 2060 最小路径覆盖
查看>>
label标签作用
查看>>
Selenium2之Web自动化编写配置(Java)
查看>>
windown快速安装xgboost
查看>>
tarjan(缩点)
查看>>
Lombok插件
查看>>