拓扑排序算法

来源:互联网 发布:万游网络传奇 编辑:程序博客网 时间:2024/06/08 06:32

用indegree来记录每个点的入度,每次输出入度为0的点,然后继续往后找。

#include <iostream>#include <queue>#include <cstdio>#include <cstring>using namespace std;int map[101][101];int indegree[101];int n,m;bool topoSort(){    queue<int> Q;    int nodeCount=0;    for(int i=1;i<=n;i++)    {        if(!indegree[i])        {            Q.push(i);//入度为0的顶点进队        }    }    nodeCount=0;    while(!Q.empty())    {        int k=Q.front();        Q.pop();        cout<<k<<" ";        nodeCount++;//统计入度为0的节点        for(int j=1;j<=n;j++)        {            if(map[k][j]!=-1)            {                indegree[j]--;                if(!indegree[j])                {                    Q.push(j);                }            }        }    }    if(nodeCount<n)    {//有环,拓扑排序失败        cout<<"There is cycle on the graph.\n";        return false;    }    return true;}int main(){    /*    input test    4 6    1 2 1    1 3 1    2 3 1    3 4 1    2 4 1    1 2 1    */   // freopen("in.txt","r",stdin);    memset(map,-1,sizeof(map));    int a,b,c;    scanf("%d %d",&n,&m);    for(int i=1;i<=m;i++)    {        scanf("%d %d %d",&a,&b,&c);        map[a][b]=c;       indegree[b]++;    }    topoSort();    return 0;}

 

原创粉丝点击