拓扑排序,然后输出最小字典序。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cmath>
#include <map>
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define E exp(double(1))
#define MAXN 100
#define MAXE 30000
#define eps 1e-7
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
#ifdef __LL64
typedef __LL64 LL;
#else
typedef long long LL;
#endif
const int N = 550;
struct INT
{
int val;
INT(){}
INT(int val):val(val){}
bool operator < (const INT &rhs) const
{
return val > rhs.val;
}
};
vector<int> G[N], ans;
int d[N];
priority_queue<INT> Q;
bool topo(int n)
{
ans.clear();
for(int i = 1; i <= n; i ++)
if(!d[i]) Q.push(INT(i));
while(!Q.empty())
{
int u = Q.top().val;Q.pop();
ans.push_back(u);
for(int i = 0; i < G[u].size(); i ++)
{
int v = G[u][i];
d[v] --;
if(!d[v]) Q.push(INT(v));
}
}
return ans.size() == n;
}
int main()
{
int n, m, u, v;
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = 1; i <= n; i ++)
G[i].clear(), d[i] = 0;
for(int i = 0; i < m; i ++)
{
scanf("%d%d", &u, &v);
d[v] ++;
G[u].push_back(v);
}
topo(n);
for(int i =0; i < n; i ++)
{
printf("%d%c", ans[i], i == n - 1 ? '\n' : ' ');
}
}
}