回 帖 发 新 帖 刷新版面

主题:[讨论]小妹我现在有一个拓扑排序的问题想请教各位高手

小妹我现在有一个拓扑排序的问题想请教各位高手
现有一个TXT文本,内有数据如下:
序号  名称    需要事先学过课程的编号
01   计算机导论   
02   高等数学   
03   线性代数
04   大学英语1
05   大学英语2         04
06   大学英语3         05
07   大学英语4         06
08   专业英语          07
09   C语言程序设计     01
10   计算机组成与原理  01
11   数论              02  03
12   JAVA程序设计      09
13   数据结构          09
14   图形学            13
15   操作系统          13
16   UNXI操作系统      15
17   计算机系统结构    10  15
18   数据库原理        01  02
19   计算机网络        01
20   分布式数据库      18  19

要求从TXT文本里读取数据,然后进行拓扑排序,以图形界面的形式将结果表示出来,请教各位高手~~~~如何对这些数据进行拓扑排序啊????语言不限,望各位高手大人能不吝指教,写下源代码,一解小妹的难题[em3]

回复列表 (共4个回复)

沙发

[code=c]
#include "bool.h"
#include "graph.h"
#include "queue.h"


void compute_indegrees(graph *g, int in[])
{
    int i,j;            /* counters */

    for (i=1; i<=g->nvertices; i++) in[i] = 0;

    for (i=1; i<=g->nvertices; i++) 
        for (j=0; j<g->degree[i]; j++) in[ g->edges[i][j] ] ++;
}
        

void topsort(graph *g, int sorted[])
{
    int indegree[MAXV];        /* indegree of each vertex */
    queue zeroin;            /* vertices of indegree 0 */
    int x, y;            /* current and next vertex */
    int i, j;            /* counters */

    compute_indegrees(g,indegree);
    init_queue(&zeroin);
    for (i=1; i<=g->nvertices; i++)
        if (indegree[i] == 0) enqueue(&zeroin,i);

    j=0;
    while (empty(&zeroin) == FALSE) {
        j = j+1;
        x = dequeue(&zeroin);
        sorted[j] = x;
        for (i=0; i<g->degree[x]; i++) {
            y = g->edges[x][i];
            indegree[y] --;
            if (indegree[y] == 0) enqueue(&zeroin,y);
        }
    }

    if (j != g->nvertices)
        printf("Not a DAG -- only %d vertices found\n",j);
}


int main()
{
    graph g;
    int out[MAXV];
    int i;

    read_graph(&g,TRUE);
    print_graph(&g);

    topsort(&g,out);

    for (i=1; i<=g.nvertices; i++)
        printf(" %d",out[i]);
    printf("\n");

}

[/code]

Copied from
http://www.cs.sunysb.edu/~skiena/392/programs/topsort.c

板凳

看不懂~~~能写出思路吗?

3 楼

每次挑选入度为0的顶点,然后删去从这个点出发的所有边。循环往复。如果找不到这样的点,说明图中有环,无法拓扑排序。

4 楼

思路

[quote]
[b]Topological Sort Algorithm[/b]
A: Direct Acyclic Graph(DAG), Sort the nodes in such order, if we have an edge E(u, v), u must before v in the sorted list.
It is very useful in scheduling, a possible sequence of activities which considers all requirements ( availability of material - storage - processing - sale). 
[b]In school, since the course has its prerequisite courses, scheduling might affect your graduation date. Here is one algorithm.[/b]

   1. Find a node without predecessor
   2. Append the node at the end of the sorted list
   3. 'Remove' the node and all its edges
   4. Repeat step 1 until the graph is empty
[/quote]

Copied from
[url]http://bobcat.webappcabaret.net/javachina/faq/algo_01.htm#algo_Q5051[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册