http://codeforces.com/gym/100792/problem/K
在普通拓扑基础上要求字典序最小 被压在最底下的元素最难满足 所以逆向考虑
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
const int maxm=4e5+10;
struct node1
{
int v,next;
};
struct node2
{
bool friend operator < (node2 n1,node2 n2)
{
return n1.id<n2.id;
}
int id;
};
node1 edge[maxm];
priority_queue <node2> que;
int first[maxn],degree[maxn],ans[maxn];
int n,m,num;
void addedge(int u,int v)
{
edge[num].v=v;
edge[num].next=first[u];
first[u]=num++;
}
void toposort()
{
node2 tmp;
int i,u,v,cnt;
for(i=1;i<=n;i++)
{
if(degree[i]==0)
{
tmp.id=i;
que.push(tmp);
}
}
cnt=n;
while(!que.empty())
{
tmp=que.top();
que.pop();
u=tmp.id;
ans[cnt--]=u;
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
degree[v]--;
if(degree[v]==0)
{
tmp.id=v;
que.push(tmp);
}
}
}
}
int main()
{
int i,u,v;
scanf("%d%d",&n,&m);
memset(first,-1,sizeof(first));
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
addedge(v,u);
degree[u]++;
}
toposort();
for(i=1;i<=n;i++) printf("%d ",ans[i]);
printf("\n");
return 0;
}