给定一个有向图,若图无环,则将其进行拓扑排序并输出,否则输出IMPOSABLE。
若存在环,输出IMPOSABLE,否则输出一行用一个空格隔开的拓扑排序的结果,若存在多个结果,输出字典序最小的。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1100;
vector<int> G[N];
vector<int> ans;
int in[N];
int cnt, n, m;
void topo()
{
priority_queue<int, vector<int>, greater<int> > q;
for (int i = 1; i <= n; i ++ ) { // 要事先把所有点push进去,因为时刻要保证字典序最小
if(in[i] == 0) {
q.push(i);
}
}
while(q.size())
{
int t = q.top();
q.pop();
cnt ++ ; // cnt求的是点数
ans.push_back(t);
vector<int>::iterator i = G[t].begin();
for (i; i != G[t].end(); i ++ )
{
in[*i]--;
if(in[*i] == 0) {
q.push(*i);
}
}
}
}
int main(){
//std::ios::sync_with_stdio(false);
//std::cin.tie(nullptr);
cin >> n >> m;
while(m -- ) {
int x, y;
cin >> x >> y;
G[x].push_back(y);
in[y] ++ ;
}
topo();
if(cnt < n) { //cnt和点数n进行比较,别比错了
cout << "IMPOSABLE" << '\n';
} else {
vector<int>::iterator i = ans.begin();
for (i; i != ans.end(); i ++ ) {
cout << *i << " \n"[i == --ans.end()];
}
}
return 0;
}