kosaraju算法
2015-08-24 16:27
197 查看
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; bool map[100][100]; //记录图形的边 bool visited[100]; //记录点是否是被访问过了。 int dfn[100]; //记录点深度优先搜索的顺序 int dotn; //记录点的个数 void init() //初始化 { cin>>dotn; int line; cin>>line; for(int i=1;i<=line;i++) { int u,v; cin>>u>>v; map[u][v]=1; } memset(visited,0,sizeof(visited)); } void dfsfirst(int u,int &time) //第一次深度优先搜索记录点的dfn值 { for(int i=1;i<=dotn;i++) { if(!visited[i]&&map[u][i]) { visited[i]=1; dfsfirst(i,time); } } dfn[++time]=u; } void dfssecond(int u) //对图的反向图进行深搜这时候只需要判断map[dfn[i]][u]就可以了因为如果此时有边就代表了方向图中有这条边 { for(int i=1;i<=dotn;i++) { if(!visited[dfn[i]]&&map[dfn[i]][u]) { visited[dfn[i]]=1; // cout<<dfn[i]<<" "; dfssecond(dfn[i]); } } } void kosaraju() { int time=0; for(int i=1;i<=dotn;i++) { if(!visited[i]) { visited[i]=1; dfsfirst(i,time); } } cout << time <<endl; memset(visited,0,sizeof(visited)); for(int i=dotn;i>=1;i--) { if(!visited[dfn[i]]) { visited[dfn[i]]=1; cout<<dfn[i]<<" "; dfssecond(dfn[i]); cout<<endl; } } } int main() { init(); kosaraju(); return 0; }
相关文章推荐
- 开博第一篇作品-C#winform版《仿360杀毒》页面切换动画效果(内含源码)
- 遗传算法_C语言
- POJ2418----Hardwood Species
- EXT JS中如何设置应用的主题
- poj 1258 Agri-Net
- 重载
- House Robber
- [Java] java中方法可以重载
- 积跬步,聚小流------div模拟select,让select美美哒
- Redis C语言
- vs2010 error LNK2005
- js汉字转拼音的方法
- 安装程序检测到 HTML 帮助数据文件已损坏,无法继续进行
- 黑马程序员-------Java笔记--------多线程基础练习2题
- mysql 读写分离
- __attribute__((weak, alias())))
- Android的NDK开发(5)————Android JNI层实现文件的read、write与seek操作
- HDU 1865
- 选择合适加密软件的6大要素
- test