您的位置:首页 > 其它

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

2017-11-08 01:07 423 查看
题目大意:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  拓扑排序