【uva-10305】Ordering Tasks (拓扑排序中最简单的一道

来源:互联网 发布:衣服数据参考 编辑:程序博客网 时间:2024/05/16 13:03

题目大意:
m是任务数,n是已知偏序个数。
接下来n行是偏序。
最后输出满足偏序条件的任意一组。

很随意很和谐的。
连谷歌翻译都不用的。


/*    uva 10305 by zhuhua    Time limit: 3000 ms    AC Time: 0 ms???*/#include <iostream>#include <cstring>#include <vector>#include <stack>using namespace std;int task[110];vector <int> S[110];vector <int> tot;stack <int> output;bool vis[110];bool flag[110];void dfs(int x){    int i;    vis[x]=true;    for(i=0;i<S[x].size();i++)    {        int next=S[x][i];        if(!vis[next])            dfs(next);    }    output.push(x);}int main(){    int n,m,x,y;    while(cin>>n>>m)    {        if(n==0&&m==0)break;        int i=1;        while(i<=n)            {S[i].clear();i++;}        tot.clear();        while(!output.empty())            output.pop();        memset(flag,0,sizeof(flag));        memset(vis,0,sizeof(vis));        while(m--)        {            cin>>x>>y;            S[x].push_back(y);            if(!flag[x])            {flag[x]=true;tot.push_back(x);}            if(!flag[y])            {flag[y]=true;tot.push_back(y);}        }        for(i=0;i<tot.size();i++)        {            int now=tot[i];            if(!vis[now])                dfs(now);        }        int cnt=0;        while(!output.empty())        {            int out=output.top();            if(cnt++)cout<<' ';            cout<<out;            output.pop();        }        for(i=1;i<=n;i++)        {            if(!flag[i])                {                    if(cnt++)cout<<' ';                    cout<<i;                }        }cout<<endl;    }    return 0;}