用c++编写(2)具体要求 利用有向图的建立和拓扑排序算法编写一程序,实现排课。 具体功能如下: 1 从文本文件中读取数据,数据包括开设课程总数以及每门课程的信息,包括课程编号、课程名称和先修课程; 2 根据文本数据建立表示课程关系的图结构; 3 利用课程关系图进行拓扑排序; 4 输出排课结果,如果数据有误(图中存在回路)输出相应的提示,否则给出课程拓扑序列; 选作功能 5 增加约束条件,例如每个学期的课程数目等,给出各个学期的课程安排。的代码
时间: 2024-03-05 08:52:56 浏览: 100
以下是用 C++ 编写的排课程序,实现了你所提出的具体要求:
```cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;
// 课程结构体
struct Course {
int id; // 课程编号
string name; // 课程名称
vector<int> prereqs; // 先修课程
int indegree; // 入度
int semester; // 学期
};
// 读取数据文件,返回课程总数和课程列表
pair<int, vector<Course>> readData(string filename) {
ifstream fin(filename);
int n;
fin >> n;
vector<Course> courses(n);
for (int i = 0; i < n; i++) {
fin >> courses[i].id >> courses[i].name;
int m;
fin >> m;
courses[i].prereqs.resize(m);
for (int j = 0; j < m; j++) {
fin >> courses[i].prereqs[j];
}
}
fin.close();
return make_pair(n, courses);
}
// 建立有向图
unordered_map<int, vector<int>> buildGraph(const vector<Course>& courses) {
unordered_map<int, vector<int>> graph;
for (const auto& course : courses) {
for (int prereq : course.prereqs) {
graph[prereq].push_back(course.id);
}
}
return graph;
}
// 拓扑排序
vector<int> topologicalSort(const unordered_map<int, vector<int>>& graph, vector<Course>& courses) {
vector<int> result;
queue<int> q;
for (auto& course : courses) {
course.indegree = 0;
}
for (const auto& p : graph) {
int u = p.first;
for (int v : p.second) {
courses[v - 1].indegree++;
}
}
for (auto& course : courses) {
if (course.indegree == 0) {
q.push(course.id);
course.semester = 1;
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
result.push_back(u);
int next_semester = courses[u - 1].semester + 1;
for (int v : graph.at(u)) {
Course& course = courses[v - 1];
if (--course.indegree == 0) {
q.push(course.id);
course.semester = next_semester;
}
}
}
return result;
}
// 输出课程拓扑序列
void printTopologicalOrder(const vector<int>& order, const vector<Course>& courses) {
cout << "课程拓扑序列:" << endl;
for (int id : order) {
const auto& course = courses[id - 1];
cout << course.id << " " << course.name << " 学期:" << course.semester << endl;
}
}
int main() {
auto data = readData("courses.txt");
int n = data.first;
auto& courses = data.second;
auto graph = buildGraph(courses);
auto order = topologicalSort(graph, courses);
if (order.size() != n) {
cout << "课程存在循环依赖,无法排课。" << endl;
} else {
printTopologicalOrder(order, courses);
}
return 0;
}
```
程序中的 `Course` 结构体存储课程信息,包括课程编号、课程名称、先修课程、入度和学期。`readData` 函数从文本文件中读取数据,返回课程总数和课程列表。`buildGraph` 函数根据课程列表建立有向图,用 `unordered_map` 存储图结构。`topologicalSort` 函数实现拓扑排序算法,返回课程拓扑序列。最后,`printTopologicalOrder` 函数输出课程拓扑序列。
程序的入口函数 `main` 中,首先读取数据文件,然后建立有向图,进行拓扑排序,并输出课程拓扑序列。如果课程存在循环依赖,程序会输出相应的提示。
阅读全文
相关推荐

















