#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}