『原创』算法#3 深度优先搜索+拓扑排序
深度优先搜索+拓扑排序
深度优先搜索可以实现拓扑排序
//深度优先搜索的完成时间进行排序就是拓扑排序的逆序。
输入图G

G的邻接矩阵存储data.txt
6
0 1 0 1 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 1 0 0 0 0
0 0 1 0 0 1
0 0 0 0 0 0
DFS程序
/*
 * @file						DFS.cpp
 * @brief						implementing DFS page117
 * @author					taoxiaoxiao
 * @date						10-1-2014
*/
#include <iostream>
#include <fstream>
using namespace std;
#define NIL -1
#define WHITE 0
#define GRAY 1
#define BLACK 2
#define INF 0x3f3f3f3f
#define MAXN 101
int graph[MAXN][MAXN]; 
int dist[MAXN], f[MAXN];
int color[MAXN], pre[MAXN];
int N, time;
void DFSVisit(int u)
{
	color[u] = GRAY;
	time=time+1;
	dist[u] = time;
	for (int i = 0; i < N; ++i)
	{
		if (graph[u][i] != 0 && color[i] == WHITE)
		{
			pre[i] = u;
			DFSVisit(i);
		}
	}
	color[u] = BLACK;
	time ++;
	f[u] = time;
}
void DFS()
{
	int i;
	for (i = 0; i < N; ++i)
	{
		color[i] = WHITE;
		pre[i] = NIL;
	}
	time = 0;
	for (i = 0; i < N; ++i)
	{
		if (color[i] == WHITE)
			DFSVisit(i);
	}
}
int main()
{
	int i, j;
	ifstream infile("data.txt");
	if (infile.is_open())
		cout << "open file successful." << endl;
	else
	{
		cout << "open file error" << endl;
		return 0;
	}
	while (!infile.eof())
	{
		infile >> N;
		for (i = 0; i < N; ++i)
		{
			for (j = 0; j < N; ++j)
				infile >> graph[i][j];
		}
		DFS();
		for (i = 0; i < N; ++i)			//顶点访问结束时间
			cout << f[i] << " ";
		cout << endl;
	}
	return 0;
}
顶点完成时间排序的一个拓扑排序
/*
* @file						DFS.cpp
* @brief					implementing DFS+拓扑排序
* @author/Univ.				taoxiaoxiao
* @date						10-1-2014
*/
#include <iostream>
#include <fstream>
using namespace std;
#define NIL -1
#define WHITE 0
#define GRAY 1
#define BLACK 2
#define INF 0x3f3f3f3f
#define MAXN 101
int graph[MAXN][MAXN];
int dist[MAXN], f[MAXN];
int color[MAXN], pre[MAXN];
int N, time;
struct str_node
{
	int id;
	int time;
} node[10];
int cmp(const void *x, const void *y)
{
	return (*(str_node*)x).time >  (*(str_node*)y).time ? -1 : 1;
}
void DFSVisit(int u)
{
	color[u] = GRAY;
	time = time + 1;
	dist[u] = time;
	for (int i = 0; i < N; ++i)
	{
		if (graph[u][i] != 0 && color[i] == WHITE)
		{
			pre[i] = u;
			DFSVisit(i);
		}
	}
	color[u] = BLACK;
	time++;
	f[u] = time;
}
void DFS()
{
	int i;
	for (i = 0; i < N; ++i)
	{
		color[i] = WHITE;
		pre[i] = NIL;
	}
	time = 0;
	for (i = 0; i < N; ++i)
	{
		if (color[i] == WHITE)
			DFSVisit(i);
	}
}
int main()
{
	int i, j;
	ifstream infile("data.txt");
	if (infile.is_open())
		cout << "open file successful." << endl;
	else
	{
		cout << "open file error" << endl;
		return 0;
	}
	while (!infile.eof())
	{
		infile >> N;
		for (i = 0; i < N; ++i)
		{
			for (j = 0; j < N; ++j)
				infile >> graph[i][j];
		}
		DFS();
		for (i = 0; i < N; ++i)
		{
			node[i].id = i;
			node[i].time = f[i];
		}
		qsort(node, N, sizeof(node[0]), cmp);
		for (i = 0; i < N; ++i)
		{
			cout << node[i].id << " ";
		}
		cout << endl;
	}
	return 0;
}
输出一个拓扑排序
4 5 0 1 2 3
 
本文系本人个人公众号「梦回少年」原创发布,扫一扫加关注。
