强连通分量
来源:互联网 发布:淘宝网秋装睡衣 编辑:程序博客网 时间:2024/05/16 02:05
1.tarjan算法
算法介绍:tarjan算法
模板:
int cnt=0; //有几个强连通分量vector<int> G[10010]; //vector邻接表int dfn[10010],low[10010]; //dfn[u]:节点u搜索的次序编号(时间戳) low[u]:u或u的子树能够追溯到的最早的栈中节点的次序号int instack[10010]; //标记是否在栈中int index=0; //节点访问次序stack<int> q;void tarjan(int u){ //根据dfn的特性,他也可以用作标记是否一个点已被访问 dfn[u] = low[u] = ++index; q.push(u); for(int i = 0 ; i < G[i].size() ; i++) { int v = G[u][i]; if(!dfn[v]) { tarjan(v); low[u] = min(low[u],low[v]); } else if(instack[u]) low[u] = min(low[u],dfn[v]); } if(low[u] == dfn[u]) { do { int v = q.top(); q.pop(); instack[v]=0; }while(u!=v); cnt++; }}
2.Gabow算法
代码:
int cnt=0;vector<int> G[10010];int dfn[10010];int part[10010]; //part[x] : x属于第part[x]个强连通分量int index=0;stack<int> q,q2;void tarjan(int u){ dfn[u]=++index; q.push(u); q2.push(u); for(int i = 0 ; i < G[u].size(); i++) { if(!dfn[G[u][i]]) gabow(G[u][i]); else if(part[G[u][i]] == -1) while(dfn[q2.top()] > dfn[G[u][i]]) //如果不用part数组记录,那么这里以及接下来的if中就要判断q2是否为空了,否则可能RE q2.pop(); } if(u == q2.top()) { int v; do { v = q.top(); q.pop(); part[v]=cnt; }while(v != u); q2.pop(); cnt++; }}
- 收缩强连通分量
- 强连通分量
- POJ2181强连通分量
- 强连通分量模板
- POJ_2762_强连通分量
- 强连通分量
- 强连通分量
- 强连通分量
- 强连通分量
- 【强连通分量】传话
- 强连通分量 关节点
- poj2186强连通分量
- 强连通分量
- 强连通分量
- 强连通分量模板
- 强连通分量
- 强连通分量tarjan
- 强连通分量scc
- perl字体颜色
- ObjectType HOOK干涉注册表操作(bypass Icesword,gmer,NIAP,etc.)
- javaweb开发中的编码问题
- C#抓取团购网销量数据
- 一Swing编程起步
- 强连通分量
- 运算符
- Reader开发(二)增加PDF阅读功能
- json infinite recursion stackoverflowerror
- 有关URL传值乱码问题
- CUSparse 第二章 使用CUSPARSE API
- 1.从eclipse中带格式复制代码
- Python * 与 ** 修饰符解析
- 用printf打印MAC地址的时候为什么要后面的&0xFF?