图的遍历 之 深度优先搜索


#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;    

#define MAX_VERTEX_NUM 10

struct Node
{
	int adjvex;
	struct Node *next;
	int info;
};

typedef struct VNode
{
	char data;
	Node *first;
}VNode, AdjList[MAX_VERTEX_NUM];

struct Graph 
{
	AdjList vertices;
	int vexnum, arcnum;
};

int visited[MAX_VERTEX_NUM];

int locateVex(Graph G, char u)
{
	int i;
	for (i = 0; i < G.vexnum; i++)
	{
		if (u == G.vertices[i].data)
			return i;
	}

	if (i == G.vexnum)
	{
		printf("Error u!\n");
		exit(1);
	}

	return 0;
}

void createGraph(Graph &G)
{
	int i, j, k, w;
	char v1, v2, enter;

	Node *p;
	printf("input vexnum & arcnum:\n");
	scanf("%d", &G.vexnum);
	scanf("%d", &G.arcnum);
	printf("input vertices:\n");
	for (i = 0; i < G.vexnum; i++)
	{
		scanf("%c%c", &enter, &G.vertices[i].data);
		G.vertices[i].first = NULL;
	}

	printf("input Arcs(v1, v2, w):\n");
	for (k = 0; k < G.arcnum; k++)
	{
		scanf("%c%c", &enter, &v1);
		scanf("%c%c", &enter, &v2);
		scanf("%d", &w);
		i = locateVex(G, v1);
		j = locateVex(G, v2);
		p = (Node *)malloc(sizeof(Node));
		p->adjvex = j;
		p->info = w;
		p->next = G.vertices[i].first;
		G.vertices[i].first = p;
	}
}

void DFS(Graph &G, int v)
{
	Node *p;
	printf("%c", G.vertices[v].data);
	visited[v] = 1;
	p = G.vertices[v].first;

	while (p)
	{
		if (!visited[p->adjvex])
			DFS(G, p->adjvex);
		p = p->next;
	}
}

void DFSTranverse(Graph &G)
{
	for (int v = 0; v < G.vexnum; v++)
		visited[v] = 0;
	for (int v = 0; v < G.vexnum; v++)
	{
		if (!visited[v])
			DFS(G, v);
	}
}

int main()
{
	Graph G;
	createGraph(G);
	DFSTranverse(G);
}

换了一种方式来写DFS

代码如下:

#include <iostream>
#include <string>

using namespace std;

#define MAXLEN 10

struct Node
{
	int data;
	Node *next;
};

struct Link
{
	int count;
	string name;
	Node *head;
};

struct Graph
{
	Link link[MAXLEN];
	int vexnum;
	int arcnum;
};

int findIndex(Graph &G, string name)
{
	int index = -1;

	for (int i = 0; i < G.vexnum; i++)
	{
		if (G.link[i].name == name)
		{
			index = i;
			break;
		}
	}

	if (index == -1)
		cout << "error" << endl;
	
	return index;
}

void constructGraph(Graph &G)
{
	cout << "construct graph yooo" << endl;
	cout << "enter vexnum" << endl;
	cin >> G.vexnum;

	string array[] = {"v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8"};
	const int size = sizeof array / sizeof *array;

	for (int i = 0; i < G.vexnum; i++)
	{
		G.link[i].name = array[i];
		G.link[i].head = NULL;
	}

	string leftName;
	string rightName;

	cout << "enter a pair" << endl;
	cin >> leftName >> rightName;
	while (leftName != "end" && rightName != "end")
	{
		int leftIndex = findIndex(G, leftName);
		int rightIndex = findIndex(G, rightName);

		Node *node = new Node;
		node->data = rightIndex;
		node->next = NULL;

		node->next = G.link[leftIndex].head;
		G.link[leftIndex].head = node;

		cout << "enter a pair" << endl;
		cin >> leftName >> rightName;
	}
}

bool flag[MAXLEN];

void DFSTranverse(Graph &G, int num)
{
	cout << G.link[num].name << " ";
	flag[num] = true;

	Node *head = G.link[num].head;
	while (head != NULL)
	{
		int index = head->data;
		if (!flag[index])
			DFSTranverse(G, index);
		head = head->next;
	}
}

void main()
{
	Graph G;
	constructGraph(G);
	for (int i = 0; i < MAXLEN; i++)
		flag[i] = false;
	DFSTranverse(G, 0);
}

DFS的迭代遍历算法:

void DFS(Graph &G)
{
	stack<int> istack;
	istack.push(0);

	cout << G.link[0].name << " ";
	flag[0] = true;

	while (!istack.empty())
	{
		int index = istack.top();
		Node *head = G.link[index].head;

		while (head != NULL && flag[head->data] == true)
			head = head->next;

		if (head != NULL)
		{
			index = head->data;
			if (!flag[index])
			{
				cout << G.link[index].name << " ";
				flag[index] = true;
				istack.push(index);
			}
		}
		else
			istack.pop();
	}
}

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