Title

用栈的方法实现深度搜索

用栈的方法实现深度搜索

#include<iostream>
#include<stdio.h>
#include<stack>
#define N 100
int n;
int tt;
int m[N][N];//用二维数组存图 
int nt[N],color[N],d[N],f[N];
static const int WHITE=0;
static const int GRAY=1;
static const int BLACK=2;

using namespace std;

int next(int u)
{
	for(int v = nt[u];v<n;v++)
	{
	//	cout<<v;
		nt[u]=v+1;//下一次关于该点的搜寻是从V+1开始
		if (m[u][v])return v; 
	}
	return -1;
}

void dfs_visit(int r)
{
	for(int i=0;i<n;i++)nt[i]=0;
	
	stack<int > S;
	S.push(r);
	color[r]=GRAY;
	d[r] = ++tt;
	
	while(!S.empty())
	{
	//	cout<<2;
		int u=S.top();
		int v=next(u);
		cout<<v<<endl;
		if(v!=-1)
		{
			//cout<<3;
			if(color[v]==WHITE)
			{
				color[v]=GRAY;
				d[v] = ++tt;
				S.push(v);
			}
		}//记着这里可以先留一命,要是子部分什么都没有才需要pop 
		else
		{
	//		cout<<4;
			S.pop();
			color[u] = BLACK;
			f[u]= ++tt;//终止时间戳 
		}
	}
	 
}

void dfs()
{
	//初始化
	for( int i=0;i<=n;i++){
		color[i] = WHITE;
		nt[i] = 0; //nt[i]=x;表示的是第i个数的下一个数是x 
	} 
	tt=0;  //时间戳赋值为0 
	
	
	//找到未访问的点进行dfs
	for(int u=0;u<n;u++)
	{
	//	cout<<1; 
	    if(color[u] == WHITE) dfs_visit(u);	
	} 
	
	//输出 
	for( int i=0;i<n;i++)
	{
		cout<<"第"<<i+1<<"个点"<<"  "<<d[i]<<"  "<<f[i]<<endl; 
	}
}


//解决图的存储 
int main()
{
	int u,k,v; 
	cin>>n;
	
	for(int i=0;i<n+1;i++)
	{
		for(int j=0;j<n+1;j++)
		{
			m[i][j]=0;
		}
	}
	
	for(int i=0;i<n;i++)
	{
		cin>>u>>k;
		for(int j=0;j<k;j++)
		{
			cin>>v;
			v--;
			m[u-1][v]=1;
		 } 
	 } 
	 
	 dfs();
	 
	 return 0;
}

参考资料

《程序设计》

posted @ 2021-03-13 15:09  BeautifulWater  阅读(62)  评论(0编辑  收藏  举报