题目链接:
http://codeforces.com/gym/100792/problem/K
题解:
按照题目要求,拓扑排序后要求小数尽量靠前,所以倒着拓扑排序,使用一个优先队列,最后倒数输出就可以了。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int inDeep[200050],n,m,cnt;
int vis[200050];
vector <int> G[200000];
priority_queue<int> q;
vector<int> ans;
void toposort()
{
for(int i = 1; i <= n; i++)
if(inDeep[i] == 0)
q.push(i);
while(!q.empty())
{
int cur = q.top();
ans.push_back(cur);
q.pop();
int len = G[cur].size();
for(int i = 0; i < len; ++i)
{
int tmp = G[cur][i];
--inDeep[tmp];
if(!inDeep[tmp])
q.push(tmp);
}
}
}
int main()
{
cin >> n >> m;
int a, b;
while(m--)
{
scanf("%d %d", &a, &b);
G[b].push_back(a);
inDeep[a]++;
}
toposort();
for(int i = n-1; i > 0; --i)
printf("%d ",ans[i]);
printf("%d\n",ans[0]);
return 0;
}