拓扑排序

这是邻接矩阵无优化版

 

背景资料:(百度百科)https://baike.baidu.com/item/%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F/5223807?fr=aladdin

 

以下为代码

/* 我们知道,拓扑排序是个重要的东西
然而,重要的东西是不可能一下子做出来的,不然他也不重要了
拓扑排序——邻接矩阵(无优化) 
*/
//当然,这是针对有向无环图的东西 

#include<iostream>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
queue <int> p1;
long int ind[100000],le[20000],ans;
long int a[5000][20000];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        int k,j;
        cin>>k>>j;
        a[k][j]=1;
        ind[j]++;//邻接矩阵的入度统计 
    }
    for(int i=1;i<=n;++i)
    {
        if(!ind[i])
        {
            p1.push(i);
            le[i]=1;//将入度为零的点压入队列 
        }
    }
    while(p1.size())
    {
        int u=p1.front();p1.pop();//取出 
        for(int i=1;i<=n;++i)
        {
            if(a[u][i]){//以下为统计等级 
            le[i]=max(le[i],le[u]+1);
            //ans=max(ans,le[i]);//计算最大值 因题而异 
            ind[i]--;//减少入度 
            if(!ind[i])//如果入度为零,压入 
            p1.push(i);
            }
        }
    }
    for(int i=1;i<=n;++i)
    {
        cout<<le[i]<<endl;
        //这点也是不必要的,因题而异 
    }
}

图论的恶心之处

 

THAT'S ALL.

posted @ 2019-03-09 11:20  Simex  阅读(142)  评论(0编辑  收藏  举报