输出一条路径
#include<iostream>
#include<stack>
#include<cstring>
#define MAXN 200000
using namespace std;
int m,n;
int in[MAXN];
struct Edge{
int next,to;
}e[MAXN];
int ecnt,head[MAXN];
inline void add(int x,int y){
e[++ecnt].to = y;
e[ecnt].next = head[x];
head[x]=ecnt;
}
void oper(int x){
cout<<x<<" ";
}
void topo(){
stack<int> S;
for(int i=1;i<=n;i++) if(in[i]==0) S.push(i);
while(!S.empty()){
int top=S.top() ;S.pop();
oper(top);
for(int i=head[top];i!=-1;i=e[i].next){
int v=e[i].to ;
in[v]--;
if(in[v]==0) S.push(v);
}
}
}
int main(){
memset(head,-1,sizeof(head));
cin>>n>>m;
int x,y;
for(int i=1;i<=m;i++){
cin>>x>>y;
add(x,y);
in[y]++;
}
topo();
return 0;
}
输出所有路径 dfs实现
#include<iostream>
#include<cstring>
#define MAXN 200000
using namespace std;
int m,n;
int ans[MAXN],cnt;
int in[MAXN];
struct Edge{
int to,next;
}e[MAXN];
int ecnt,head[MAXN];
inline void add(int x,int y){
e[++ecnt].to = y;
e[ecnt].next = head[x];
head[x]=ecnt;
}
inline void print(){
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
cout<<endl;
// cnt++;
}
bool vis[MAXN];
void dfs(int dp){
if(dp==n+1){
print();
return;
}
for(int i=1;i<=n;i++){
if(!vis[i]&&in[i]==0){
for(int j=head[i];j!=-1;j=e[j].next){
in[e[j].to]--;
}
vis[i]=1;
ans[dp]=i;
dfs(dp+1);
for(int j=head[i];j!=-1;j=e[j].next){
in[e[j].to]++;
}
vis[i]=0;
}
}
}
int main(){
memset(head,-1,sizeof(head));
cin>>n>>m;
int x,y;
for(int i=1;i<=m;i++){
cin>>x>>y;
add(x,y);
in[y]++;
}
dfs(1);
cout<<cnt<<endl;
return 0;
}