zoukankan      html  css  js  c++  java
  • 深度优先搜索

    #include<iostream>
    using namespace std;
    
    #define Inf 65535
    #define NotAVerter -1
    
    int time = 0; //全局变量
    
    /////////////////////邻接链表的相关定义//////////////////////
    typedef struct EdgeNode *position;
    typedef struct Led_table* Table;
    
    
    struct EdgeNode     //边表结点 
    {
    	int adjvex;    // 邻接点域,存储该顶点对应的下标 
    	int color;    //此标志表示对应的节点是否已经搜索到,0为白色,1为灰色,2为黑色
    	int t_start;
    	int t_finish;
    	int precursor;  //此数据记录该节点在广度优先树种的前驱节点
    	position next; // 链域,指向下一个邻接点
    };
    
    struct Led_table       // 邻接表结构 
    {
    	int data;                //邻接表的大小
    	position *firstedge;       //边表头指针,可以理解为数组
    };
    
    
    //////////////////////////邻接链表相关函数定义///////////////
    Table Creat_Lable(int MaxElements)    //MaxElements参数为希望创建的节点数
    {
    
    	Table table1 = static_cast<Table> (malloc(sizeof(struct Led_table)));
    	table1->data = MaxElements;
    	if (table1 == NULL)
    	{
    		cout << "out of space!!!";
    	}
    
    	table1->firstedge = static_cast<position*>(malloc(sizeof(position)*(table1->data)));
    	if (table1->firstedge == NULL)
    	{
    		cout << "out of space!!!";
    	}
    
    	//给每个表头赋值,从0开始
    	for (int i = 0; i <= table1->data - 1; ++i)
    	{
    		table1->firstedge[i] = static_cast<position>(malloc(sizeof(EdgeNode)));   //申请一个节点
    		if (table1->firstedge[i] == NULL)
    		{
    			cout << "out of space!!!";
    		}
    		table1->firstedge[i]->adjvex = 0;   //表头这个参数没有意义
        	table1->firstedge[i]->color = 0;    //全部设置为白色
    		table1->firstedge[i]->t_start = 0;
    		table1->firstedge[i]->t_finish = 0;
    		table1->firstedge[i]->precursor = NotAVerter;
    		table1->firstedge[i]->next = NULL;
    
    	}
    	return table1;
    
    }
    
    
    void Insert(Table table1, int v, int w)   //表示存在一条边为<v,w>
    {
    	position p = static_cast<position>(malloc(sizeof(EdgeNode)));   //申请一个节点
    	if (p == NULL)
    	{
    		cout << "out of space!!!";
    	}
    	p->adjvex = w;
    	p->color = 0;    //对于普通节点来说无意义
    	p->t_finish = 0;
    	p->t_start = 0;
    	p->precursor = NotAVerter;  //对于普通节点来说无意义
    	p->next = table1->firstedge[v]->next;
    	table1->firstedge[v]->next = p;
    
    
    }
    
    
    
    /////////////////////////////////深度优先搜索算法/////////////////////////////////
    void Dfs_Visit(Table table1, int u)
    {
    	time = time + 1;
    	table1->firstedge[u]->t_start = time;
    	table1->firstedge[u]->color = 1;
    
    	position p = table1->firstedge[u]->next;
    	while (p != NULL)
    	{
    		if (table1->firstedge[p->adjvex]->color == 0)
    		{
    			
    			table1->firstedge[p->adjvex]->precursor = u;
    			Dfs_Visit(table1, p->adjvex);
    		}
    		p = p->next;
    	}
    	table1->firstedge[u]->color = 2;
    	time++;
    	table1->firstedge[u]->t_finish = time;
    }
    
    
    
    
    int main()
    {
    	Table table_1 = Creat_Lable(6);    //创建一个大小为8的邻接表
    
    	Insert(table_1, 0, 1); Insert(table_1, 0, 3);
    	Insert(table_1, 1, 4);
    	Insert(table_1, 2, 5);
    	Insert(table_1, 3, 1); 
    	Insert(table_1, 4, 3); Insert(table_1, 4, 2);
    	Insert(table_1, 5, 5); 
    
    	Dfs_Visit(table_1, 0);
    
    	for (int i = 0; i <= table_1->data - 1; ++i)
    	{
    		cout << "结点" << i << "的起始时间为" << table_1->firstedge[i]->t_start
    			<< "结束时间为" << table_1->firstedge[i]->t_finish << endl;
    	}
    		
    	
    
    	return 0;
    }
    

      夜深了。

  • 相关阅读:
    AD域撤销域用户管理员权限方案
    域普通用户执行金蝶K/3权限不够解决方法
    redis安装windows+64位
    解决pycharm中no python interpreter configured问题
    python3报错---Error in sitecustomize; set PYTHONVERBOSE for traceback: NameError: name 'reload' is not defined
    python+robot+oracle:执行脚本时中文sql报错:UnicodeEncodeError: 'ascii' codec can't encode
    git-最简单的操作流程
    pycharm配置后执行RF脚本
    性能测试-jmeter基础5-设计数据自动递增
    性能测试-jmeter基础4-设置日期的递增参数demo
  • 原文地址:https://www.cnblogs.com/1242118789lr/p/7587632.html
Copyright © 2011-2022 走看看