您的位置:首页 > 其它

AOV 拓扑排序

2013-03-27 19:22 323 查看
/*
*			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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: