强连通分量两种算法。tarjan和kosaraju
2014-08-03 23:21
363 查看
tarjan
kosaraju
/***********************************************\ |Author: YMC |Created Time: 2014/5/10 22:36:04 |File Name: tarjan.cpp |Description: \***********************************************/ #include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <string> #include <cstring> #include <algorithm> #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> using namespace std; #define maxn 100005 int n; int stop; int cnt; int visitnum; int dfn[maxn]; int low[maxn]; bool instack[maxn]; int stap[maxn]; int belong[maxn]; #define mod 1000000007 vector<int>tree[maxn]; void tarjan(int i){ int j; dfn[i] = low[i] = ++visitnum; instack[i] = true; stap[++stop] = i; for(int k=0;k<tree[i].size();k++){ j = tree[i][k]; if(!dfn[j]){ tarjan(j); if(low[j]<low[i]) low[i] = low[j]; } else if(instack[j] && dfn[j]<low[i]) low[i] = dfn[j]; } if(dfn[i] == low[i]){ cnt++; do{ j = stap[stop--]; instack[j] = false; belong[j] = cnt; } while(j!=i); } } void solve(){ stop = cnt = visitnum = 0; memset(dfn,0,sizeof(dfn)); for(int i=1;i<=n;++i){ if(!dfn[i]) tarjan(i); } } long long val[maxn]; long long ma[maxn]; long long mb[maxn]; #define inf 0x7fffffff int main() { //freopen("input.txt","r",stdin); n = 6; tree[1].push_back(3); tree[1].push_back(2); tree[2].push_back(4); tree[3].push_back(5); tree[3].push_back(4); tree[4].push_back(1); tree[4].push_back(6); tree[5].push_back(6); solve(); for(int i=1;i<=n;++i){ cout<<belong[i]<<" "; } cout<<endl; return 0; }
kosaraju
/***********************************************\ |Author: YMC |Created Time: 2014/5/11 20:26:18 |File Name: mykosaraju.cpp |Description: \***********************************************/ #include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <string> #include <cstring> #include <algorithm> #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> using namespace std; #define maxn 100 int v; vector <int> G[maxn]; vector <int> rG[maxn]; vector <int> vs; bool used[maxn]; int cmp[maxn]; void add_edge(int from,int to){ G[from].push_back(to); rG[to].push_back(from); } void dfs(int v){ used[v] = true; for(int i=0;i<G[v].size();++i){ if(!used[G[v][i]]) dfs(G[v][i]); } vs.push_back(v); } void rdfs(int v,int k){ used[v] = true; cmp[v] = k; for(int i=0;i<rG[v].size();++i){ if(!used[rG[v][i]]) rdfs(rG[v][i],k); } } int scc(){ memset(used,false,sizeof(used)); vs.clear(); for(int i=0;i<v;++i){ if(!used[i]) dfs(i); } memset(used,false,sizeof(used)); int k = 1; for(int i=vs.size()-1;i>=0;--i){ if(!used[vs[i]]) rdfs(vs[i],k++); } return k; } int main() { //freopen("input.txt","r",stdin); v = 6; for(int i=1;i<=6;++i){ G[i].clear(); rG[i].clear(); } add_edge(1,3); add_edge(1,2); add_edge(2,4); add_edge(3,5); add_edge(3,4); add_edge(4,1); add_edge(4,6); add_edge(5,6); scc(); for(int i=1;i<=v;++i){ cout<<cmp[i]<<" "; } cout<<endl; return 0; }各有优势~
相关文章推荐
- 求强连通分量的三种算法——Kosaraju, Tarjan, Gabow
- 有向图强连通分量的Tarjan算法
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
- kosaraju算法求强连通分量
- 强连通分量及缩点tarjan算法解析
- 【转】有向图强连通分量的Tarjan算法
- 强连通分量 Kosaraju PK Tarjan(转)
- [笔记]: Tarjan算法求有向图的强连通分量
- Tarjan求解有向图强连通分量的线性时间的算法
- tarjan算法之 强连通分量
- Tarjan三大算法之强连通分量
- HDU 1269 迷宫城堡 (裸的Tarjan算法求强连通分量, 可作模版)
- 强连通分量 Tarjan 算法入门笔记
- 连通图关节点求解详解--tarjan算法,重连通分量的求解--栈
- 求强连通分量的Tarjan算法
- 强连通分量分解--Kosaraju算法分析与证明
- 强连通分量Kosaraju、Tarjan【模板】
- tarjan算法求强连通分量
- 极大强连通分量的Tarjan算法
- tyvj 1111 舞会 有向图强连通分量 Kosaraju模板 tarjan模板