洛谷2661-tarjan-强连通分量
来源:互联网 发布:手机淘宝实人认证在哪 编辑:程序博客网 时间:2024/05/21 03:15
中文题目
求最小的强连通分量(1除外。)
看的卿学姐的视频。。
targin是通过寻找 scc中第一个点,在经过其他点又到达第一个点时,将这个强连通分量中的点全部 搞到(都保存在栈里了)
听说这个算法还有其他应用。要好好学。恩
#include <iostream>#include <cstdio>#include <cstdlib>#include <stack>#include <vector>#include <cstring>using namespace std;const int maxn=200006;int dfn[maxn];//dfs顺序。和一种求lca的序不一样??int low[maxn];//最小能够到达的点。int index1;//记录时间的标号bool state[maxn];//是否在栈里.stack<int>s;vector<int>G[maxn];int cnt[maxn];int num[maxn];int scc;void tarjan(int u){ dfn[u]=low[u]=++index1; s.push(u); state[u]=true; for(int i=0;i<G[u].size();i++){ if(!dfn[G[u][i]]){ tarjan(G[u][i]); low[u]=min(low[G[u][i]],low[u]); } else if(state[G[u][i]]) low[u]=min(low[u],dfn[G[u][i]]);//在次遇见你。。 } if(low[u]==dfn[u]) { scc++; for(;;) { int x = s.top();s.pop(); cnt[x]=scc; num[scc]++; if(x==u)break; } }}int main(){ int t; int a; scanf("%d",&t); for(int i=1;i<=t;i++){ scanf("%d",&a); G[i].push_back(a); } memset(state,false,sizeof(state)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(cnt,0,sizeof(cnt)); for(int i=1;i<=t;i++) if(!dfn[i]) tarjan(i); int ans=1e8; for(int i=1;i<=scc;i++) if(num[i]>1) ans=min(ans,num[i]); printf("%d\n",ans); return 0;}
阅读全文
0 0
- 洛谷2661-tarjan-强连通分量
- 强连通分量tarjan
- 强连通分量 Tarjan
- Tarjan强连通分量
- 强连通分量-Tarjan
- tarjan求强连通分量
- 强连通分量 Tarjan算法
- POJ1236强连通分量tarjan
- 强连通分量 tarjan算法
- poj1236强连通分量(Tarjan)
- tarjan 求强连通分量
- 强连通分量Tarjan模板
- 强连通分量Tarjan算法
- Tarjan强连通分量算法
- 强连通分量(Tarjan)
- hdu1269 强连通分量tarjan
- 强连通分量Tarjan算法
- tarjan强连通分量求割点
- 心之力
- CodeVS2058 括号序列 题解
- Mysql在insert触发器里如何update当前数据
- 关于Mysql 全文索引的使用
- linux 上使用commons-net.jar中 FTPClient类的listFiles、retrieveFile等方法停止不执行,出现假死状态解决办法
- 洛谷2661-tarjan-强连通分量
- redis在window下安装
- Android 开发之 ---- bootloader (LK)
- [Unity]旋转
- php 拆分数组,之后算出每一个数组的和
- 一篇文章读懂无人机全产业链(含主控芯片厂商信息)
- QTabWdiget的使用
- 揭露效果实现
- php计算问题