DFS遍历图代码(算法导论思路实现)
2015-07-14 10:57
393 查看
#include<iostream> #include<vector> #include<cstring> #include<cstdio> using namespace std; const int maxn = 10005; int color[maxn]; //0代表白色,1代表灰色,2代表黑色 vector<int> vec[maxn]; //邻接表 int step; //全局变量代表总步数 int stime[maxn]; //每个点遍历的时候的起始时间 int etime[maxn]; //每个点遍历的时候的终止时间 bool exist[maxn]; //判断图中是否存在该点 int parent[maxn]; void init() { memset(color,0,sizeof(color)); //初始化都为白色 memset(stime,0,sizeof(stime)); memset(etime,0,sizeof(etime)); memset(parent,-1,sizeof(parent)); //初始化每个结点的父亲都为-1 step = 0; } void dfs_visit(int u) { int i; int pos; step++; stime[u] = step; color[u] = 1; //刚刚访问到这一结点,置为灰色 int len = vec[u].size(); for(i=0;i<len;i++) { pos = vec[u][i]; if(color[pos] == 0) { parent[pos] = u; dfs_visit(pos); } } color[u] = 2; //邻接点全部遍历完了,置为黑色 step++; etime[u] = step; } void dfs() { int i; for(i=1;i<maxn;i++) { if(exist[i] != false && color[i] == 0) //存在这个点且这个点为白色 { dfs_visit(i); } } } void print() { int i; for(i=0;i<maxn;i++) { if(exist[i] != false) { cout<<i<<"点的信息如下:"<<endl; cout<<"起始时间:"<<" "<<stime[i]<<" "<<"结束时间:"<<" "<<etime[i]<<endl; } } } int main() { int start; int num1,num2; init(); freopen("1.txt","r",stdin); while(cin>>num1>>num2 && num1 != 0 && num2 != 0) { vec[num1].push_back(num2); //有向图 exist[num1] = true; exist[num2] = true; } /*for(int i=0;i<maxn;i++) { if(exist[i] == true) { cout<<i<<endl; } }*/ dfs(); print(); return 0; }
相关文章推荐
- 用django 模板中文显示乱码
- [LeetCode][Java] Jump Game II
- java之类加载器
- 【Lowest Common Ancestor of a Binary Tree】cpp
- python实现爬虫下载美女图片
- eclipse安装svn插件
- java学习路线分享,让你少走弯路
- python里的del变量无法立刻释放内存的解决办法
- combox绑定枚举和读取枚举
- 3.创建一个20个大小的随机数组,找出这组数组的最大值和最小值, 并且标出最大数和最小值的位置
- Python实现查找系统盘中需要找的字符
- Ruby下WebDriver的相关操作指南
- C#读写txt文件的两种方法介绍
- MATLAB图像增强程序
- spring框架下单元测试
- vsftpd+ldap认证
- spring工作原理
- php页面出现空白解决方法
- 利用C++文件流进行数据块的读写
- 借助百度api通过经纬度查询位置信息