有向图的深度优先遍历,以及对边的分类的判断

在AdjacencyList.h中:

#ifndef AdjacencyList_H
#define AdjacencyList_H

#include "stdio.h"
#include "stdlib.h"

#define WHITE 0
#define GRAY 1
#define BLACK 2

typedef struct node *node_ptr;
struct node
{
	int to_vertex;
	int is_tree_edge;
	node_ptr next;
};

void Init();
void CreateDG_AL();
void DFS_Visit(int);
void DFS_Traverse();
void JudgeAndOutput();
void FreeAdjacencyList();

#endif

在AdjacencyList.cpp中:

#include "AdjacencyList.h"

FILE *file;

int n_vertices;
int *d;
int *f;
int *color;
node_ptr *g;

int time=0;

void Init()/*初始化*/
{
	int i;
	int temp;

	file=freopen("input1","r",stdin);

	temp=scanf("%d",&n_vertices);
	d=(int *)malloc(n_vertices*sizeof(int));//发现事件的时间
	f=(int *)malloc(n_vertices*sizeof(int));//结束事件的时间
	color=(int *)malloc(n_vertices*sizeof(int));//顶点的颜色
	g=(node_ptr *)malloc(n_vertices*sizeof(node_ptr));

	for(i=0;i<n_vertices;i++)
	{
		color[i]=WHITE;
		d[i]=0;
		f[i]=0;
	}
}

void CreateDG_AL()/*创建有向图*/
{
	int outEdges=0;
	int data=0;
	int i;
	int j;
	int temp;
	node_ptr p;

	for( i=0;i<n_vertices;i++)
	{
		g[i]=NULL;
		temp=scanf("%d",&outEdges);
		for(j=0;j<outEdges;j++)
		{
			temp=scanf("%d",&data);
			p=(node_ptr)malloc(sizeof(struct node));
			p->to_vertex=data;
			p->is_tree_edge=0;
			p->next=g[i];
			g[i]=p;
		}
	}
}

void DFS_Visit(int u)/*从某个顶点开始进行深度遍历*/
{
	node_ptr p;
	int v;
	color[u]=GRAY;
	d[u]=++time;
	for(p=g[u];p;p=p->next)
	{
		v=p->to_vertex;
		if(color[v]==WHITE)
		{
			p->is_tree_edge=1;
			DFS_Visit(v);
		}
	}
	color[u]=BLACK;
	f[u]=++time;
}

void DFS_Traverse()/*对每个结点进行深度遍历*/
{
	int u;
	for(u=0;u<n_vertices;u++)
	{
		if(color[u]==WHITE)
			DFS_Visit(u);
	}
}

void JudgeAndOutput()/*按邻接表的顺序进行输出边的分类*/
{
	node_ptr p;
	int u;
	for(u=0;u<n_vertices;u++)
	{
		p=g[u];
		while(p)
		{
			if(p->is_tree_edge==1)
			{
				printf("tree\n");
				p=p->next;
			}
			else
			{
				int v=p->to_vertex;
				if(d[u]<d[v] && d[v]<f[v] && f[v]<f[u])
					printf("forward\n");
				else if(d[v]<d[u] && d[u]<f[u] && f[u]<f[v])
					printf("back\n");
				else if(d[v]<f[v] && f[v]<d[u] && d[u]<f[u])
					printf("cross\n");
				p=p->next;
			}
		}
	}
}

void FreeAdjacencyList()//释放空间
{
	free(d);
	free(f);
	free(color);
	free(g);
}

在Main.cpp中:

#include "AdjacencyList.h"
int main()
{
	Init();
	CreateDG_AL();
	DFS_Traverse();
	JudgeAndOutput();
	FreeAdjacencyList();
	return 0;
}

测试数据:

7 2 6 2 0 2 6 4 2 5 0 1 1 1 4 1 1

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/hackerain/article/details/6582328
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞