C++算法7:拓扑排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuan_zizizi/article/details/81903137

1.对一个有向无环图(Directed Acyclic Graph,DAG)G进行拓扑排序,是将G中所有顶点排成线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.
一种可能的拓扑排序结果2->8->0->3->7->1->5->6->9->4->11->10->12
这里写图片描述
2.代码:

#include<iostream>
#include<queue>
using namespace std;

//函数声明
const int N = 13;
void TopLogic(int DataArray[N][N], int indegree[], int result[]);
void Cout(int Data[], int len);
//计算最短路径条数
void TopLogic(int DataArray[N][N], int indegree[], int result[])
{
    int count = 0;
    queue<int> q;
    for (int i = 0; i < N; i++)
    {
        if (indegree[i] == 0)
        {
            q.push(i);
        }
    }
    int cur;
    while (!q.empty())
    {
        cur = q.front();
        q.pop();
        result[count++] = cur;
        for (int i = 0; i < N; i++)
        {
            if (DataArray[cur][i] != 0)
            {
                indegree[i]--;
                if (indegree[i] == 0)
                {
                    q.push(i);
                }
            }

        }

    }
}

void Cout(int Data[], int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << Data[i] << "   ";
    }
}

//主函数
int main()
{
    int G[N][N];
    int indegree[N] = {0, 1, 0, 1, 2, 2, 1, 1, 0, 1, 1, 1, 2};
    int result[N];
    memset(G, 0, sizeof(int)*N*N);
    memset(result, 0, sizeof(int)*N);
    G[0][1] = G[0][5] = G[0][6] = 1;
    G[2][0] = G[2][3] = 1;
    G[3][5] = 1;
    G[5][4] = 1;
    G[6][4] = G[6][9] = 1;
    G[7][6] = 1;
    G[8][7] = 1;
    G[9][10] = G[9][11] = G[9][12] = 1;
    G[11][12] = 1;
    TopLogic(G, indegree, result);
    Cout(result, N);
    return 0;
}

3.结果:

0  2  8  1  6  3  7  9  5  10  11  4  12  请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/xuan_zizizi/article/details/81903137
今日推荐