C++课设—拓补排序的实现
文章目录
简介
给大二的自动化专业《软件技术基础》课程写的C++程序,采取了菜单式的设计模式,可从文件中读入邻接矩阵的元素数据,之后再根据出入度判断是否为AOV网。若是AOV网,则输出拓补排序后的结果。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<fstream>//用于操作文件的c++io流库
using namespace std;
const int V=500+10;//定义最大节点数
int INF=10e8;//两点间无边的特殊情况
int flag=0;//用于表示是否能构成拓补排序
int vexnum;
int indegree[V];
int G[V][V];//采用邻接矩阵来存图;
void CreatGragph(){
string temp;
int count=0;//获取矩阵的行数,即顶点的个数
ifstream inf;
inf.open("matrix.txt",ios::in);
if(inf.fail()) cout<<"读取失败!"<<endl;
else{
while (getline(inf,temp,'\n'))
{
if(temp.size()>0) count++;
}
}
vexnum=count;
for(int i=0;i<count;i++){
for(int j=0;j<count;j++){
inf>>G[i][j];//将文件中的矩阵存入存放图的二维数组
}
}
inf.close();
}
void FindIndgree(int G[][V]){//找出度的个数
int cnt=0;
memset(indegree,0,sizeof(indegree));
for(int i=0;i<vexnum;i++){
for(int j=0;j<vexnum;j++){
if(G[j][i]&&G[j][i]!=INF){
cnt++;
}
indegree[i]=cnt;
cnt=0;
}
}
}
void topological_sort(int n) //拓扑排序函数
{
int i, j, k;
for(i = 1; i <= n; i++){
for(j = 1; j <= n; j++){
if(indegree[j] == 0){ //找到入度为0的顶点
flag=1;//构成了拓补排序
printf("%d",j); //输出
indegree[j]--; //将其入度减为-1
k = j; //用k记录此顶点
break;
}
if(flag==0)
printf("无法构成拓补排序!\n");
}
}
}
void menu()
{
int opt=-1;
while(opt){
cout<<" "<<endl;
cout<<"这是一个可以进行拓补排序操作的程序,若输入的邻接矩阵可以构成拓补排序,则将直接输出排序结果"<<endl;
cout<<"请选择功能: 1)进行拓补排序 2)退出程序\n"<<endl;
int otp;
cin>>otp;
opt=otp;
switch (opt)
{
case 1:{
CreatGragph();
FindIndgree(G);
topological_sort(vexnum);
break;
}
case 2:
exit(0);
break;
default:
cout<<"选择错误!请重新选择!"<<endl;
}
}
}
int main()
{
menu();
return 0;
}