拓扑排序 【Kahn算法】时间复杂度 V*V + E (个人认为)

 

Ordering Tasks

 UVA – 10305  下面的代码也是这道题的题解:

 

#include<cstdio>
#include<map>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;

#define Maxn 110
int dge[Maxn],G[Maxn][Maxn]; // 分别为 一个顶点的入度,和一个邻接图G

int main(void)
{
    //freopen("in.txt","r",stdin);
   // freopen("out.txt","w",stdout);
    int n,m;
    while(cin >> n >> m) {
        if(n == 0 && m == 0) break;
        memset(dge,0,sizeof(dge));
        memset(G,0,sizeof(G));
        int tmp,tp;
        for(int i = 1 ; i <= m ; ++i) {
            cin >> tmp >> tp;
            G[tmp][tp] = 1;  // tmp->tp 标记为 1
            dge[tp]++;  // tp的入度 + 1
        }
        queue<int> qu;  
        // 把入度为 0 的顶点放进 队列中
        for(int i = 1 ; i <= n ; ++i)  if(!dge[i]) qu.push(i);
        while(!qu.empty()) {
            int v = qu.front();
            qu.pop();
            // 一个一个地弹出入度为 0 的顶点
            cout << v;
            // 判断这个顶点有没有与其他顶点有边,如果有,则这个顶点的入度 - 1 
            // 如果入度 为 0 ,则把这个顶底继续放进队列中,直到队列为空
            for(int i = 1 ; i <= n ; ++i) if(G[v][i]) { dge[i]--; if(!dge[i]) qu.push(i); }
            if(!qu.empty()) cout << " "; else cout << endl;
        }
        //如果队列为空,仍有顶点入度不为0,则说明有环
    }
    return 0;
}

 

 

 

 

 

 

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/godleaf/article/details/80955690
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞