拓扑排序

来源:互联网 发布:wps不能使用数据透视表 编辑:程序博客网 时间:2024/06/02 06:32

♥ 有错误请指出哟~

*1、定义:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。
即:按照 图中各点 出现的先后顺序排列

*

*2.步骤:
(1) 选择一个入度为0的顶点并输出

(2) 从图中删除此点及其所有出边,该点及所有与该点相邻的点的入度-1。

循环结束后,若输出的顶点数小于网中的顶点数,即图不空,则输出“有回路”信息,否则输出的序列就是一种拓扑序列。

*

*3.代码实现

//找入度为零的边#include<iostream>#include<cstring>#define maxx 105using namespace std;int n,m,indegree[maxx],mapp[maxx][maxx],x,y;void toposort(int in[maxx],int a[maxx][maxx],int mm){//入度-- ≈ 删边,∴要保证有边可删,∴循环m次        for(int i=1;i<=mm;i++)    {        for(int j=1;j<=mm;j++)        {            if(in[j] == 0)            {                in[j]--;                cout<<j;                for(int k=1;k<=mm;k++)                {                    if(a[j][k] == 1)                    {                        in[k]--;                    }                }            }        }    }} int main(){    cin>>n>>m;    memset(mapp,0,sizeof(mapp));    memset(indegree,0,sizeof(indegree));    for(int i=1;i<=n;i++)    {        cin>>x>>y;//x与y相邻        mapp[x][y]=1;        indegree[y]++;     }    toposort(indegree,mapp,m);    return 0;}
原创粉丝点击