4-1 Topological Sort (9分)

来源:互联网 发布:win8.1配置java环境 编辑:程序博客网 时间:2024/05/29 03:15

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 i=0,count=0,j;int degree[MaxVertexNum] = {0};int deque[MaxVertexNum];int front=0, rear=0;PtrToAdjVNode temp;for(i=0;i<Graph->Nv;i++){              //找到节点的度temp = Graph->G[i].FirstEdge;while (temp != NULL) {degree[temp->AdjV]++;temp = temp->Next;}}for (j = 0; j < Graph->Nv; j++) {if (degree[j] == 0) {deque[rear++] = j;break;}}while (rear != front) {        //用队列不会超时TopOrder[count++] = deque[front];temp = Graph->G[deque[front]].FirstEdge;while (temp != NULL) {degree[temp->AdjV]--;if (degree[temp->AdjV] == 0)deque[rear++] = temp->AdjV;temp = temp->Next;}front++;}/*for (i = 0; i < Graph->Nv; i++) {//这是原来写的暴力解法,某个点会超时,看来还是需要多加锻炼思维vno = Graph->Nv;for (j = 0; j < Graph->Nv; j++) {if (a[j] == 0) {vno = j;break;}}if (vno >= Graph->Nv)return false;else {TopOrder[i] = vno;a[vno] = MaxVertexNum+1;temp = Graph->G[vno].FirstEdge;while (temp != NULL) {a[temp->AdjV]--;temp = temp->Next;}}}*/if(count==Graph->Nv)return true;return false;}

感想:

1.注意图示意思,FirstEdge指的是第一条边而不是链表的起始点

2.注意算法使用,其实用<deque>会更好

0 0
原创粉丝点击