pat拓扑排序

pat拓扑排序_第1张图片
pat拓扑排序_第2张图片

#include 
#include 
#include 
#define  TRUE   1
#define  FALSE  0
#define  OK     1
#define  ERROR 0
#define  OVERFLOW  -1
#define MAXSIZE 30
#define VERTEX_MAX 30  
#define VEX_NUM 10

typedef int Status;
typedef char Vextype[20];  
typedef int ElemType;

typedef struct
{
    ElemType elem[MAXSIZE];
    int top;
}SeqStack;            

typedef struct node      
{
    int  adjvex;          
    struct node* next; 
}EdgeNode;
typedef struct vnode   
{
    int Indegree;        
    Vextype  vertex;     
    EdgeNode* firstedge;
}VertexNode;
typedef struct                       
{
    VertexNode adjlist[VERTEX_MAX];
    int n, e;                           
} ALGraph;


void InitStack_Sq(SeqStack& s)                    
{
    s.top = -1;  
}

int Empty_Sq(SeqStack s)                       
{
    if (s.top == -1)
        return 1;
    else
        return 0;
}
Status Push_SeqStack(SeqStack& s, ElemType x)
{
    if (s.top >= MAXSIZE - 1)
        exit(OVERFLOW);
    s.elem[++s.top] = x;
    return OK;
}

Status  Pop_SeqStack(SeqStack& s, ElemType& y)
{
    if (Empty_Sq(s)) 
        return OVERFLOW;           
    else 
    {
        y = s.elem[s.top];
        s.top--;  
        return OK;
    }                                        
}
void CreateALGraph(ALGraph& G)
{
    int i, v, w;
    int Indegree[VERTEX_MAX] = { 0 };
    EdgeNode* s;
    scanf("%d,%d", &(G.n), &(G.e)); 
    for (i = 0; i < G.n; i++)
    {
        scanf("%s", G.adjlist[i].vertex);
        G.adjlist[i].firstedge = NULL;
    }
    for (w = 0; w < G.e; w++) 
    {
        scanf("%d,%d", &i, &v);
        s = (EdgeNode*)malloc(sizeof(EdgeNode));
        s->adjvex = v;
        Indegree[v]++; 
        s->next = G.adjlist[i].firstedge;    
        G.adjlist[i].firstedge = s;
    }
    for (i = 0; i < G.n; i++)
        G.adjlist[i].Indegree = Indegree[i];
}
void topsort(ALGraph& G)
{
    int i, v, w;
    int cnt = 0;//计数器初始化为0
    EdgeNode* ptr;
    SeqStack st;
    InitStack_Sq(st);
    for (i = 0; i < G.n; i++)
    {
        if (!G.adjlist[i].Indegree)
            Push_SeqStack(st, i);
    }
    while (!Empty_Sq(st))
    {
        Pop_SeqStack(st, v);//出栈一次,出栈元素放在v中
        printf("%s ", G.adjlist[v].vertex);
        ++cnt;
        ptr = G.adjlist[v].firstedge; //ptr指向第一个边结点
        while (ptr != NULL)//只要有边
        {
            w = ptr->adjvex;
            --G.adjlist[w].Indegree;
            if (G.adjlist[w].Indegree == 0)
                Push_SeqStack(st, w);
            ptr = ptr->next;
        }
    }
    if (cnt < G.n)
        printf("后续无法输出!\n");
}

int main()
{
    ALGraph g;
    CreateALGraph(g);
    printf("拓扑序列为:");
    topsort(g);
    return 0;
}

你可能感兴趣的:(算法,c++,数据结构,图论,拓扑学)