强联通模板
2015-11-18 14:20
218 查看
vector<int> G[maxn];
int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
stack<int > S;
void dfs(int u) {
pre[u]=lowlink[u]=++dfs_clock;
S.push(u);
for(int i=0;i<G[u].size();i++) {
int v=G[u][i];
if(!pre[v]) {
dfs(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}else if(!sccno[v]) {
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(lowlink[u]==pre[u]) {
scc_cnt++;
for(;;) {
int x=S.top(); S.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
}
void find_scc(int n) {
dfs_clock=scc_cnt=0;
memset(sccno,0,sizeof(sccno));
memset(pre,0,sizeof(pre));
for(int i=0;i<n;i++) if(!pre[i]) dfs(i);
}
int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
stack<int > S;
void dfs(int u) {
pre[u]=lowlink[u]=++dfs_clock;
S.push(u);
for(int i=0;i<G[u].size();i++) {
int v=G[u][i];
if(!pre[v]) {
dfs(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}else if(!sccno[v]) {
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(lowlink[u]==pre[u]) {
scc_cnt++;
for(;;) {
int x=S.top(); S.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
}
void find_scc(int n) {
dfs_clock=scc_cnt=0;
memset(sccno,0,sizeof(sccno));
memset(pre,0,sizeof(pre));
for(int i=0;i<n;i++) if(!pre[i]) dfs(i);
}
相关文章推荐
- listview改变选中行字体颜色
- 类似POPView菜单
- 云服务器使用初体验博客征文获奖通知
- Android编程之OpenGL绘图技巧总结
- 错误处理与调试
- shell到底是什么?
- 头文件问题
- android studio 下,Activity跳转之共享元素
- C#中一种替换switch语句更优雅的写法
- c++封装多线程类
- python类型判断
- mysqld --debug=d:t:i:O:n --user=mysql (源码调试)
- 如何通过REST获取JENKINS的编译进度?
- SystemFile
- Busybox文件系统的移植
- QT在VS2010下的使用配置
- 10 款最好的远程桌面软件
- warehouse提供的免费oracle学习视频
- $.AJAX()
- order by跟group by 跟having----------------sum() 求和 avg()求平均 count() 求个数--------------like