C++课设—拓补排序的实现

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;
}
发布了15 篇原创文章 · 获赞 16 · 访问量 1015

猜你喜欢

转载自blog.csdn.net/weixin_44522586/article/details/103648533