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
- 4-1 Topological Sort (9分)
- Topological Sort(25 分)
- topological-sort
- Topological Sort
- Topological Sort
- Topological Sort
- Topological Sort-拓扑排序
- 拓扑排序(Topological Sort)
- 拓扑排序 Topological-sort
- Topological Sort Summary
- 拓扑排序 - Topological Sort
- Topological Sort拓扑排序
- c编写 Topological Sort
- !!!Chapter 9 Graph Algorithm (9.1 ~ 9.3) Topological Sort/Shortest-Path
- 拓扑排序(Topological Sort)
- 拓扑排序(Topological Sort)
- 拓扑排序(topological-sort)
- 拓扑排序(topological sort)
- 理解字节序:大端模式、小端模式
- 理解Docker容器端口映射
- 1ObjectMapper、SimpleModule、JsonNode三个类解释 2ObjectMapper类的writeValueAsString、valueToTree、readTree等方法
- Velocity 模板语法
- 【备注】【C18】《名家讲坛-JAVA开发实战经典》 PDF 下载
- 4-1 Topological Sort (9分)
- linux的目录以及作用
- HDU 1016 Prime Ring Problem
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 第十二周 求两数的最大公约数
- 盗版毕加索
- app接口设计之signature签名的php实现
- 十一章 上机1
- Asp.net MVC 利用(aspose+pdfobject.js) 实现在线预览word、excel、ppt、pdf文件