简单拓扑排序

来源:互联网 发布:淘宝客机器人破解版 编辑:程序博客网 时间:2024/06/05 15:48

找到入度为0的顶点,入队,删除它和它的出度,重复操作;如果我删除的顶点数小于我输入的顶点数,则有向图中有回路,排序失败。

##include<cstdio>#include<vector>#include<queue>using namespace std;vector<int>a[100];int indegree[100];queue<int>q;int n,m;void addcin(int u,int v){    a[u].push_back(v);    indegree[v]++;//入度}bool TopologicalSort(){    for(int i=0;i<n;i++)    {        if(indegree[i]==0)        {            q.push(i);        }    }    int cot=0;    //重复操作    while(!q.empty())    {        int o=q.front();        q.pop();        printf("%d ",o);        cot++;        vector<int>::iterator it = a[o].begin();        for(;it!=a[o].end();it++)        {            if(!(--indegree[*it]))            {                q.push(*it);            }        }    }    if(cot<n)    {        return false;    }    else    {        return true;    }}int main(){    int u,v;    while(scanf("%d %d",&n,&m)!=EOF)    {        for(int i=0;i<m;i++)        {            scanf("%d %d",&u,&v);            addcin(u,v);        }        TopologicalSort();        printf("\n");    }}