zoukankan      html  css  js  c++  java
  • 拓扑排序

                                                拓扑排序

    一.定义

        对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。

       通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

       注意:

       1)只有有向无环图才存在拓扑序列;

       2)对于一个DAG,可能存在多个拓扑序列;

       如:

       该DAG的拓扑序列为A B C D或者A C B D

     而此有向图是不存在拓扑序列的,因为图中存在环路

    二.拓扑序列算法思想

     (1)从有向图中选取一个没有前驱(即入度为0)的顶点,并输出之;

     

     (2)从有向图中删去此顶点以及所有以它为尾的弧;

         重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
    三.代码实现
        采用邻接矩阵实现,map[i][j]=0,表示节点i和j没有关联;map[i][j]=1,表示存在边<i,j>,并且j的入度加1;
    #include<iostream>
    #include<stdlib.h>
    #include<stdio.h>
    #define MAX 100
    usingnamespace std;
    
    void toposort(int map[MAX][MAX],int indegree[MAX],int n)
    {
        int i,j,k;
        for(i=0;i<n;i++) //遍历n次
        {
            for(j=0;j<n;j++) //找出入度为0的节点
            {
                if(indegree[j]==0)
                {
                    indegree[j]--;
                    cout<<j<<endl;
                    for(k=0;k<n;k++) //删除与该节点关联的边
                    {
                        if(map[j][k]==1)
                        {
                            indegree[k]--;
                        }
                    }
                    break;
                }
            }
        }
    }
    
    
    int main(void)
    {
        int n,m; //n:关联的边数,m:节点数
        while(scanf("%d %d",&n,&m)==2&&n!=0)
        {
            int i;
            int x,y;
            int map[MAX][MAX]; //邻接矩阵
            int indegree[MAX]; //入度
            memset(map,0,sizeof(map));
            memset(indegree,0,sizeof(indegree));
            for(i=0;i<n;i++)
            {
                scanf("%d %d",&x,&y);
                if(!map[x][y])
                {
                    map[x][y]=1;
                    indegree[y]++;
                }
            }
            toposort(map,indegree,m);
        }
        return0;
    }
  • 相关阅读:
    HTML元素解释
    Java命名规范
    HDU 1058 Humble Numbers(DP,数)
    HDU 2845 Beans(DP,最大不连续和)
    HDU 2830 Matrix Swapping II (DP,最大全1矩阵)
    HDU 2870 Largest Submatrix(DP)
    HDU 1421 搬寝室(DP)
    HDU 2844 Coins (组合背包)
    HDU 2577 How to Type(模拟)
    HDU 2159 FATE(二维完全背包)
  • 原文地址:https://www.cnblogs.com/dolphin0520/p/2017737.html
Copyright © 2011-2022 走看看