拓扑排序

#include<iostream>
#include<stdio.h>
#include "Stack.h"
#define Status int
#define MAXVEX  100
#define OK 0
#define ERROR -1
using namespace std;
typedef struct EdgeNode  /*边结点*/
{
       int adjvex;//邻接点域,存储该顶点对应的下标
       struct EdgeNode *next;//指向下一条弧的指针
}EdgeNode;
typedef struct VertexNode  /*顶点表结点*/
{
       int in;  //顶点的入度
       char data;  //顶点域,存储顶点信息
       EdgeNode *firstedge;//边表头指针
}VertexNode, AdjList[MAXVEX];
typedef struct         //图结构
{
     AdjList adjList;  //邻接表
     int numVertexes, numEdges; //顶点数和弧数
}ALGraph;
//找到顶点所在数组的位置
 int  LocateVex(ALGraph G,char v){
      for(int i = 0; i<G.numVertexes; ++i){    //头结点表
         if( G.adjList[i].data==v){
         return i;
      }     //输入顶点值
     }
     return ERROR;
 }

Status CreateUDG(ALGraph &G){//采用邻接表表示法,创建无向图G
     cout<<"输入图的顶点数目和边的数目:";
     char v1,v2;
     EdgeNode *p1;
     int i,j;
     cin>>G.numVertexes;
     cin>>G.numEdges;    //输入总顶点数,总边数
      cout<<"输入图的顶点:";
     for(int m=0; m<G.numVertexes; ++m){    //输入各点,构造头结点表
       cin>> G.adjList[m].data;     //输入顶点值
       G.adjList[m].firstedge=NULL; //初始化表头结点的指针域为NULL
        G.adjList[m].in=0;
     }
    //for
     cout<<"按方向输入图的边的关联的两个顶点:";
    for(int k = 0; k<G.numEdges;++k){                //输入各边,构造邻接表
       cin>>v1>>v2;                             //输入一条边依附的两个顶点v1->v2
       i = LocateVex(G, v1);  //找到顶点所在的位置
       j = LocateVex(G, v2);

      //将新结点*p1插入顶点vi的边表头部
       p1=new EdgeNode; //生成一个新的边结点*p1
       p1->adjvex=j;     //邻接点序号为j
       p1->next= G.adjList[i].firstedge;
       G.adjList[i].firstedge=p1;

       //v2入度加一
       G.adjList[j].in++;
    }//for

    return OK;
}//CreateUDG
//拓扑排序,若GL无回路,则输出拓扑排序序列并返回OK,若有回路返回ERROR
Status TopologicalSort(ALGraph GL) {
          Stack s;
          EdgeNode *e;
          int i, k, gettop;
          int count=0;//用于统计输出顶点的个数
          for(i=0;i<GL.numVertexes; i++)
            if(GL.adjList[i].in==0)
                 s.push(i); //将入度为0的顶点的下标入栈

         while(s.isEmpty()==false)//栈不是空的时候
         {
           gettop=s.pop();//得到栈顶中顶点的下标
           //cout<<s.pop()<<" "; //打印此顶点
           cout<<GL.adjList[gettop].data<<" "; //打印此顶点
          // cout<<GL.adjList[0].data<<" "; //打印此顶点
           count++;//顶点数加一

           e=GL.adjList[gettop].firstedge;//得到该顶点的第一条边
           while(e!=NULL)
            {
                 //cout<<"进入"<<" "; //打印此顶点
               k=e->adjvex;//得到第一个对应的顶点数组下标
                GL.adjList[k].in--;
                int n= GL.adjList[k].in;
               if(n==0)//将k号顶点邻接点的入度减1
                  s.push(k);//若为0,则入栈
                e=e->next;
            }
        }
        if (count< GL.numVertexes)
            return ERROR;
        else
            return OK;
}
int main(){
    ALGraph G;
    CreateUDG(G);
    TopologicalSort(G);

    }

//栈文件

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#define MAX 100
class Stack{
private:
    int  s[MAX];
    int head;
public:
    //初始化栈
    Stack(){
        head = 0;
    }
   //出栈
    int pop(){
        char t;
        if(head>0){
            t = s[--head];//先减,后pop
        }
        return t;
    }
    //入栈
    void push(int value){//后加
        s[head++] = value;
    }

    //栈是否为空
    bool isEmpty(){
        if(head==0)
            return true;
        return false;
    }
};

#endif // STACK_H_INCLUDED


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值