很明显的topo排序,字典序输出+优先队列.......
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<functional>
#include<vector>
using namespace std;
priority_queue<int, vector<int>, greater<int> >s1;
const int M=100005;
struct linklist
{
int x;
linklist *next;
};
linklist s[M];
int n ,m;
int a[M];
int vis[M];
int tot=0;
bool toposort()
{
for (int i=1; i<=n; i++) if(!vis[i]) s1.push(i);
if (s1.empty()) return false;
int tj=0;
while (!s1.empty())
{
int v=s1.top();
tj++;
vis[v]=2*n;
a[++tot]=v;
s1.pop();
for (linklist *j=s[v].next; j!=NULL; j=j->next)
{
int t=j->x;
vis[t]--;
if (!vis[t]) s1.push(t);
}
}
if (tj<n) return false;
else return true;
}
void insert(linklist &x, int y)
{
linklist *t;
t=new(linklist);
t->x=y;
t->next=x.next;
x.next=t;
}
void init()
{
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++)
{
s[i].x=i;
s[i].next=NULL;
}
for (int i=1; i<=m; i++)
{
int x, y;
scanf("%d %d", &x, &y);
insert(s[x], y);
vis[y]++;
}
}
int main()
{
init();
if (!toposort()) printf("OMG.\n");
else {
for (int i=1; i<=tot; i++)
{
printf("%d ", a[i]);
}
}
return 0;
}