1. 实验目的 (1)掌握算法的自然语言描述法,流程图绘制方法以及伪代码描述方法。
(2)理解算法的执行过程。
(3)掌握算法的编程实现方法、调试方法及测试方法。
2. 实验任务 按照实验教程上图 1-6 的伪代码,实现基于深度优先(DFS)的有向图拓扑 排序算法。具体要求如下:
(1)阅读并理解该伪代码。
(2)根据测试用例,分析该算法的执行过程。
(3)用 C++语言实现该算法,并针对测试用例,将程序运行结果和手工分 析结果进行对比验证。
(4)撰写实验报告,实验报告内容包括实验目的、实验任务、实验环境、 实验步骤、实验结果和实验总结等部分。
3. 实验环境 3.1 硬件环境
(1) 计算机:ALIENWARE R13
(2) CPU: Intel® Core™ i7-7700HQ CPU@2.80GHZ
(3) RAM:32GB
3.2 软件环境
(1) 操作系统:Windows11 家庭中文版
(2) 开发工具:Visual Studio 2022
4. 实验步骤及结果
4.1 实验预习
4.1.1 用 C/C++语言实现该算法
算法要求的输入格式为: 第一行是两个整数 n m,分别表示图的顶点数和边数,顶点从 1 到 n 编号; 其后有 m 行,每行两个整数,分别表示每条有向边的起始顶点和结束顶点。 例:测试用例 1 对应的输入如下:
5 5
1 2
2 4
2 5
3 4
4 5
算法要求的输出格式为:3 1 2 4 5
按照拓扑排序排好的顶点编号,编号之间用一个空格分割。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXSIZE = 100;
using namespace std;
int arr[MAXSIZE];//记录排序后的顺序
int num = 0;
int T[MAXSIZE][MAXSIZE];//标记图
int V;//顶点个数
int E;//边的个数
int visit[MAXSIZE]{ 0 };
int stacked[MAXSIZE]{ 0 };
int i; //全局变量 i
//栈
struct Stack
{
int data[MAXSIZE];
int top;
};
//初始化栈
Stack* initStack()
{
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
return s;
}
//判断是否栈空
int isEmpty(Stack* s)
{
return s->top == -1;
}
//入栈
int push(Stack* s, int x)
{
if (s->top < MAXSIZE)
{
s->data[++s->top] = x;
return 0;
}
cout << "栈满" << endl;
return -1;
}
//出栈
int pop(Stack* s)
{
if (s->top == -1)
{
cout << "栈空" << endl;
return -1;
}
return s->data[s->top--];
}
int TS_visit(int v, Stack* s)
{
if (stacked[v]) {
cout << "Cycle detected, not a DAG" << endl;
exit(1);
}
if (!visit[v]) {
stacked[v] = 1;
for (int w = 1; w <= V; w++) {
if (T[v][w] == 1) {
TS_visit(w, s);
}
}
stacked[v] = 0;
visit[v] = 1;
//arr[i] = v;
push(s, v);
i--;
}
return 0;
}
int topSort()
{
Stack* s = initStack();
for (int n = 1; n <= V; n++) {
if (!visit[n]) {
TS_visit(n, s);
}
}
while (s->top != -1)//将栈中的所有元素放入 arr 数组中
{
arr[num++] = pop(s);
}
return 0;
}
int main()
{
int src, dest;
memset(T, 0, sizeof(T));
memset(visit, 0, sizeof(visit));
memset(stacked, 0, sizeof(stacked));
//cout << "请输入顶点个数:";
cin >> V;
//cout << "请输入边的个数:";
cin >> E;
//cout << "请输入边:" << endl;
for (int i = 0; i < E; i++)
{
cin >> src >> dest;
T[src][dest] = 1;//标记边
}
i = V - 1;
topSort();
//cout << "拓扑排序:" << endl;
for (int i = 0; i < V; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}