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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40307434/article/details/78474195

题目大意:
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;
}

猜你喜欢

转载自blog.csdn.net/qq_40307434/article/details/78474195
今日推荐