/*
* AOV
* TopSort
* Date: 2013/3/27
* NolanJian
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_VERTEX 100
struct node;
struct hnode;
typedef struct node Node;
typedef struct hnode Hnode;
typedef Node *NodePointer;
void TopSort(void);
void Input(void);
void Add(int x, int y);
void InitialiseGraph(void);
struct node {
int Vertex;
NodePointer Next;
};
struct hnode {
int Count;
NodePointer Next;
};
int N, M;
Hnode Graph[MAX_VERTEX];
int main() {
while(1) {
Input();
TopSort();
}
}
void TopSort(void) {
int i, j, k, top = -1, flag = 1;
NodePointer p;
for(i = 0; i < N; i++) {
if(Graph[i].Count == 0) {
Graph[i].Count = top;
top = i;
}
}
for(i = 0; i < N; i++) {
if(top == -1) {
printf("\nNetwork has a cycle. TopSort terminated.\n");
flag = 0;
exit(1);
}
else {
j = top;
top = Graph[top].Count;
printf("V%d ", j);
for(p = Graph[j].Next; p; p = p->Next) {
k = p->Vertex;
Graph[k].Count--;
if(Graph[k].Count == 0) {
Graph[k].Count = top;
top = k;
}
}
}
}
if(flag)
printf("\n");
}
void Input(void) {
int i, x, y;
scanf("%d%d", &N, &M);
InitialiseGraph();
for(i = 0; i < M; i++) {
scanf("%d%d", &x, &y);
Add(x, y);
}
return ;
}
void Add(int x, int y) {
NodePointer tmp = (NodePointer)malloc(sizeof(Node));
tmp->Next = NULL;
tmp->Vertex = y;
Graph[y].Count++;
if(Graph[x].Next == NULL) {
Graph[x].Next = tmp;
return ;
}
tmp->Next = Graph[x].Next;
Graph[x].Next = tmp;
return ;
}
void InitialiseGraph(void) {
int i;
for(i = 0; i < N; i++) {
if(Graph[i].Next)
free(Graph[i].Next);
Graph[i].Next = NULL;
Graph[i].Count = 0;
}
return ;
}
AOV 拓扑排序
最新推荐文章于 2023-10-26 23:12:33 发布