一見すると、この質問は、突然無知力、\(SB \)トポロジタイトルシーケンスは、スポット笑いスプレー、黒であることが判明しました。
\(\の) \(コース、\) 、私はヒープを行う問題です。(実際には、プライオリティキューなので、手書きのヒープでありますゴミどのように私はそれを使用することができます)
\((1)\)まず、図1に内蔵。場合\(X \)が必要\(Y \)からの前のを\(Y \)する(X \)\接続されたエッジを。
\((2)\) 、次いで第一の反応器のないエッジ点は添加しませんでした。スタックから最小数をダウン取り出します。
\((3)\)と、その後のポイントにすべてのヒープを接続します。ヒープ領域まで。ポイントが取られていない場合は、\(N- \)番目の出力も可能。それ以外の場合、出力はダウンだけで細かい点。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAX_N=100010;
struct EDGE{
int v,nxt;
}e[MAX_N];
int d,n,m,in[MAX_N],cnt,head[MAX_N],a[MAX_N];
priority_queue<int> q;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-'){
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
void add(int u,int v){
e[++cnt].v=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
bool bfs(){
while(!q.empty()){
int p=q.top();
q.pop();
cnt++;
a[cnt]=p;
for(int i=head[p];i;i=e[i].nxt){
int v=e[i].v;
in[v]--;
if(!in[v]){
q.push(v);
}
}
}
return cnt==n;
}
int main(){
d=read();
while(d--){
memset(in,0,sizeof(in));
memset(head,0,sizeof(head));
cnt=0;
n=read(),m=read();
for(int i=1;i<=m;i++){
int x,y;
x=read(),y=read();
add(y,x);
in[x]++;
}
for(int i=1;i<=n;i++){
if(!in[i]){
q.push(i);
}
}
cnt=0;
if(bfs()){
for(int i=n;i>=1;i--){
printf("%d ",a[i]);
}
printf("\n");
}else{
printf("Impossible!\n");
}
}
return 0;
}
/*
3
5 4
5 4
5 3
4 2
3 2
3 3
1 2
2 3
3 1
5 2
5 2
4 3
1 5 3 4 2
Impossible!
1 5 2 4 3
*/