拓扑排序模板

记录一下模板,其余详细的在PPT里有

int topo_sort() 
{ 
    for(int i = 1; i <= N; ++i) 
        if(!indegree[i]) q.push(i); 
    int cnt = 0; //用于判断有无环 
    while(!q.empty()) 
    { 
        cnt++; 
        int tmp = q.front(); 
        q.pop(); 
        for(int i = 0; i < G[tmp].size(); ++i) 
        { 
            int node = G[tmp][i]; 
            indegree[node]--; 
            if(!indegree[node]) 
            q.push(node); 
        } 
        if(!q.empty())    cout << tmp << ' ‘; 
        else cout << tmp; 
        } 
        if(cnt < N) return -1; //若成环则为-1 
} 

 

畅通工程:

#include <bits/stdc++.h>

using namespace std;
const int MX = 500+10;
int n, m;
vector<int> G[MX];
//queue<int> q;
int indegree[MX];
priority_queue<int, vector<int>, greater<int> > q;

void tupo_sort()
{
    for(int i = 1; i <= n; ++i)
        if(!indegree[i]) q.push(i);
    while(!q.empty())
    {
        int tmp = q.top();
        q.pop();
        for(int i = 0; i < G[tmp].size(); ++i)
        {
            int node = G[tmp][i];
            indegree[node]--;
            if(!indegree[node]) q.push(node);
        }
        if(!q.empty())cout  << tmp << ' ';
        else cout << tmp;
    }
    cout << endl;
}

int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        for(int i = 0; i <= n; ++i) G[i].clear();
        memset(indegree, 0, sizeof(indegree));
        while(m--)
        {
            int node1, node2;
            scanf("%d%d", &node1, &node2);
            G[node1].push_back(node2);
            indegree[node2]++;
        }
        tupo_sort();

    }
    return 0;
}

 

posted @ 2019-08-23 03:36  mpeter  阅读(76)  评论(0)    收藏  举报