拓扑排序(邻接矩阵)

Description

有向图的顶点数为n(0 < n<=20),图中的顶点信息为整数i(0 <=i<=n-1),采用邻接矩阵存储,编写程序输出该图的拓扑序列 。

要求:入度为零的顶点用栈存储。

Input

输入数据:
第1行:顶点数,弧数
第2行开始,每行输入一个顶点偶对,例如:vi,vj
Output

输出数据:
以空格分隔的拓扑序列,如果存在环,则输出空或者部分顶点。

Sample Input

6,8
0,1
0,2
0,3
2,1
2,4
3,4
5,3
5,4
Sample Output

5 0 3 2 4 1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAX_VERTEX_NUM 20
using namespace std;
typedef struct
{
    int arc[MAX_VERTEX_NUM+10][MAX_VERTEX_NUM+10];
    int vexnum,arcnum;
} Mgraph;
int num[MAX_VERTEX_NUM+10];
void init(Mgraph *G)
{
    memset(G->arc,0,sizeof(G->arc));
    memset(num,0,sizeof(num));
    char ch;
    scanf("%d,%d",&G->vexnum,&G->arcnum);
    for(int i=1; i<=G->arcnum; i++)
    {
        int a,b;
        scanf("%d,%d",&a,&b);
        if(!G->arc[a][b])
        {
            G->arc[a][b]=1;
            num[b]++;
        }
    }
}
void topo(Mgraph &G)
{
    int T=G.vexnum;
    while(T--)
    {
        int sub=0,i,j;
        for(i=G.vexnum-1; i>=0; i--)//题目要求栈存储入入度为0的点,这里要逆序遍历
        {
            if(!num[i])
            {
                sub=i;
                break;
            }
        }
        num[sub]--;
        if(i==-1)
            break;
        else
            cout<<sub<<" ";
        for(j=0; j<G.vexnum; j++)
        {
            if(G.arc[sub][j]!=0) num[j]--;
        }
    }
}
int main()
{
    Mgraph G;
    init(&G);
    topo(G);
}

数组实现

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int N,M;
    char ch;
    while(cin>>N>>ch>>M)
    {
        int i,j,k,a,b;
        int flag[501][501]= {0};
        int num[501]= {0};
        for(i=1; i<=M; i++)
        {
            cin>>a>>ch>>b;
            if(flag[a][b]==0)
            {
                flag[a][b]=1;
                num[b]++;
            }
        }
        int t=0;
        for(i=1; i<=N; i++)
        {
            for(j=N-1; j>=0; j--)
            {
                if(num[j]==0)
                {
                    t=j;
                    break;
                }
            }
            num[t]--;
            if(j==-1)
                break;
            else
                cout<<t<<" ";
            for(k=0; k<N; k++)
            {
                if(flag[t][k]!=0)
                    num[k]--;
            }
        }
        cout<<endl;
    }
}
    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/Akatsuki__Itachi/article/details/78548818
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞