鱼C论坛

 找回密码
 立即注册
查看: 3545|回复: 0

[学习笔记] 《数据结构与算法》——拓扑排序

[复制链接]
发表于 2017-8-20 16:55:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 luciferzf 于 2017-8-20 22:02 编辑

拓扑排序:
建立一个有向图,我们称之为AOV图。我们需要将AOV图中每个点进行排序,按照入度的多少的顺序。我们用栈结构来储存点,首先我们先将入度为0的点压入栈中,然后把压入栈中的点从AOV图中删除,与其相邻的点的度减一。
在代码实现的过程中,我们使用数组来储存每个点,用链表的方式来储存每个点的出度。当进行遍历的时候,我们将所有入度为0的点压入栈中,然后把改点的出度的点的入度减一。循环至所有点都被压入栈中。
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;

int stack[1000];
int N;

class graph
{
public:
        int low;
        graph *np=NULL;
};

class VERTEX
{
public:
        int power=0;
        graph *np = NULL;
};

void Input(VERTEX vertex[])
{
        int a, b;
        printf("input the edge of graph and end with double -1:\n");
        cin >> a >> b;
        graph *cp=NULL;
        while (a != -1)
        {
                if (vertex[a].np == NULL)
                {
                        vertex[a].np = new graph;
                        cp = vertex[a].np;
                }
                else
                {
                        cp->np = new graph;
                        cp = cp->np;
                }
                cp->low = b;
                vertex[b].power++;
                cin >> a >> b;
        }
}

void print(VERTEX vertex[])
{
        for (int i = 0; i < N; i++)
        {
                printf("%d",stack[i]);
                if (i != N-1)
                {
                        printf("——>");
                }
                else
                {
                        cout << endl;
                }
        }
}

int main()
{
        int count=0;
        cout << "input the numbers of the vertexes:";
        cin >> N;
        int edge=0;
        cout<<"input the numbers of the edge:";
        cin>>edge;
        VERTEX vertex[edge];
        Input(vertex);
        graph *cp;
        while (count < N)
        {
                int precount = count;
                for (int i = 1; i <= N; i++)
                {
                        if (vertex[i].power == 0)
                        {
                                stack[count++] = i;
                                vertex[i].power = -1;
                        }
                }
                while (precount != count)
                {
                        cp = vertex[stack[precount]].np;
                        while (cp != NULL)
                        {
                                vertex[cp->low].power--;
                                cp = cp->np;
                        }
                        precount++;
                }
        }
        print(vertex);
        system("PAUSE");
}

评分

参与人数 1鱼币 +3 收起 理由
小甲鱼 + 3

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 23:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表