c编写 Topological Sort

来源:互联网 发布:package java 编辑:程序博客网 时间:2024/05/18 18:21
Topological Sort  

Write a program to find the topological order in a digraph.

Format of functions:

bool TopSort( LGraph Graph, Vertex TopOrder[] );

where LGraph is defined as the following:

typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{    Vertex AdjV;    PtrToAdjVNode Next;};typedef struct Vnode{    PtrToAdjVNode FirstEdge;} AdjList[MaxVertexNum];typedef struct GNode *PtrToGNode;struct GNode{      int Nv;    int Ne;    AdjList G;};typedef PtrToGNode LGraph;

The topological order is supposed to be stored in TopOrder[] whereTopOrder[i] is the i-th vertex in the resulting sequence. The topological sort cannot be successful if there is a cycle in the graph -- in that caseTopSort must return false; otherwise return true.

Notice that the topological order might not be unique, but the judge's input guarantees the uniqueness of the result.

Sample program of judge:

#include <stdio.h>#include <stdlib.h>typedef enum {false, true} bool;#define MaxVertexNum 10  /* maximum number of vertices */typedef int Vertex;      /* vertices are numbered from 0 to MaxVertexNum-1 */typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{    Vertex AdjV;    PtrToAdjVNode Next;};typedef struct Vnode{    PtrToAdjVNode FirstEdge;} AdjList[MaxVertexNum];typedef struct GNode *PtrToGNode;struct GNode{      int Nv;    int Ne;    AdjList G;};typedef PtrToGNode LGraph;LGraph ReadG(); /* details omitted */bool TopSort( LGraph Graph, Vertex TopOrder[] );int main(){    int i;    Vertex TopOrder[MaxVertexNum];    LGraph G = ReadG();    if ( TopSort(G, TopOrder)==true )        for ( i=0; i<G->Nv; i++ )            printf("%d ", TopOrder[i]);    else        printf("ERROR");    printf("\n");    return 0;}/* Your function will be put here */

Sample Input 1 (for the graph shown in the figure):

5 71 04 32 12 03 24 14 2

Sample Output 1:

4 3 2 1 0

Sample Input 2 (for the graph shown in the figure):

5 80 31 04 32 12 03 24 14 2

Sample Output 2:

ERROR
代码如下:
bool TopSort(LGraph Graph,Vertex TopOrder[]){int counter=0;int Indegree[MaxVertexNum];int queue[MaxVertexNum];int head=0,tail=0;PtrToAdjVNode node;int i=0,j=0;for(i=0;i<MaxVertexNum;i++){TopOrder[i]=0;Indegree[i]=0;queue[i]=-1;}for(i=0;i<Graph->Nv;i++){node=Graph->G[i].FirstEdge;while(node!=NULL){Indegree[node->AdjV]++;node=node->Next;}}for(i=0;i<Graph->Nv;i++){if(Indegree[i]==0)queue[tail++]=i;}while(head!=tail){j=queue[head++];TopOrder[counter++]=j;node=Graph->G[j].FirstEdge;while(node!=NULL){Indegree[node->AdjV]--;if(Indegree[node->AdjV]==0){queue[tail++]=node->AdjV;}node=node->Next;}}if(counter!=Graph->Nv)return false;return true;}
0 0
原创粉丝点击