实验 1.4 有向图拓扑排序

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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值