拓扑排序的一道水题

来源:互联网 发布:c语言入门经典第六版 编辑:程序博客网 时间:2024/05/18 18:03

  Ordering Tasks

 

题目大意:假设有n个变量,还有m个二元组(u,v)分别表示变量u小于v。那么,输出从小到大排列起来的变量。

分析:将n个点根据所给条件建一个图,然后查找入度为零的顶点,输出之后将这个点与这个点与别的点之间的连接都删除,再搜索下一个入度为0的节点,最后输出结果:

#include <iostream>#include <cstdio>#include <cstring>#include <stack>#include <queue>using namespace std;int block[105][105];int id[105];queue<int> la;int main(){    int m,n;    while(cin>>n>>m&&n)        //m可以为零    {        memset(block,0,sizeof(block));        memset(id,0,sizeof(id));        for(int i=0; i<m; i++)        {            int a,b;            cin>>a>>b;            block[a][b]=1;     //建图            id[b]++;           //各节点的入度        }        for(int i=1; i<=n; i++)        {            if(id[i]==0)                la.push(i);        }        int count=0;           //count计算输出的节点的个数        while(!la.empty())     //将!la.empty() 改成count<=n时会WA,不知道为什么,求指点        {            int v=la.front();            la.pop();            if(count==0)                cout<<v;            else                cout<<" "<<v;            count++;            for(int k=1; k<=n; k++)            {                if(block[v][k]!=0&&--id[k]==0)                    la.push(k);            }        }        cout<<endl;    }    return 0;}