zoukankan      html  css  js  c++  java
  • 用栈的方法实现深度搜索

    用栈的方法实现深度搜索

    #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;
    }
    

    参考资料

    《程序设计》

  • 相关阅读:
    域渗透基础(二)
    域渗透基础(一)
    域环境搭建
    java基础(五)-----new一个对象的具体过程
    数据结构(八)-----散列表
    数据结构(七)-----跳表
    数据结构(六)-----队列
    数据结构(五)-----栈
    数据结构(四)-----链表
    数据结构(三)-----数组
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/14528910.html
Copyright © 2011-2022 走看看