输出所有可能拓扑排序代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
-----武汉理工大学计算机学院数据机构课程设计----
-----题目:拓扑排序
-----姓名:
-----专业班级:计算机0909
-----学号:
----------------------说明---------------------
本程序使用C++语言编写,使用STL
测试运行平台为Visual Studio2010
栈数据结构使用stack模版生成,包含头文件
队列数据结构使用queue模版生成,包含头文件
源代码在Visual Studio2010上运行通过。
2011-07-01 ------------------------------------------------
*/
#define DEBUG//预编译调试标识
#include
#include
#include
using namespace std;
#define MAX_VERTEX_NUM20
#define InfoType int//InfoType
#define VertexType char//VertexType
typedef struct ArcNode{
int adjvex;
struct ArcNode*nextarc;
InfoType*info;//弧的相关信息
}ArcNode;
typedef struct VNode{
VertexType data;
ArcNode*firstarc;
bool isEx;//标识点是否删除
int indegree;//入度
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
void CreatGraph(ALGraph&G)
{
int pos,k=0;//pos实际位置k计数头结点的第几条弧
ArcNode*p,*q;//出错原为ArcNode*p;
cout<<"请输入顶点数目:";cin>>G.vexnum;
cout<
cout<
for(int i=0;i<=G.vexnum-1;i++)
{
G.vertices[i].firstarc=NULL;//初始化为空,以便利于后续判断
G.vertices[i].isEx=true;//初始化点,标识点存在
G.vertices[i].indegree=0;//初始化点入度
k=0;//每一个顶点的弧数初始化为0
//p=G.vertices[i].firstarc;
cout< cout< cin>>G.vertices[i].data; pos=0;//pos赋值使得可以进入while while(pos>=0&&pos { cout< cin>>pos;//输入实际位置 if(pos>=0&&pos { k++;//对弧数计数 p=new ArcNode; p->nextarc=NULL;//初始化为空,以便利于后续判断 p->adjvex=pos; if(k==1) G.vertices[i].firstarc=p;//k==1表示头结点的第一条弧 if(k>1) q->nextarc=p;//将后续弧连接到上一条弧的nexarc指针域 q=p;//存储弧 }//if }//while }//for }//CreatGraph void FindInDegree(ALGraph&G) { ArcNode*p; for(int i=G.vexnum-1;i>=0;--i) p=G.vertices[i].firstarc; while(p!=NULL)//判断是否为空 { G.vertices[p->adjvex].indegree++; p=p->nextarc; }//while }//for } /* //--------单一拓扑排序算法---------- int TopologicalSort(ALGraph G){ stack for(int i=0;i if(!G.vertices[i].indegree)S.push(i); int count=0; int temp,k; while(!S.empty()){ temp=S.top(); S.pop(); cout< ++count; for(ArcNode *p=G.vertices[temp].firstarc;p;p=p->nextarc) { k=p->adjvex; if(!(--G.vertices[k].indegree))S.push(k); }//for }//while if(count else return0; }//TopologicalSort */ bool isdegree(ALGraph G) { #ifdef DEBUG cout<<"进入isdegree()"< #endif for(int i=0;i { if(G.vertices[i].isEx&&G.vertices[i].indegree==0)return true;