根据给出的条件建边,然后进行dfs
对于某个点x,当x的后继都遍历完毕后,再输出x节点。
这样能保证所有约束条件。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int maxn=30000+10; int n,m; vector<int>g[maxn]; int flag[maxn]; void dfs(int x) { flag[x]=1; for(int i=0;i<g[x].size();i++) { if(flag[g[x][i]]==1) continue; dfs(g[x][i]); }printf("%d ",x); } int main() { scanf("%d%d",&n,&m); memset(flag,0,sizeof flag); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); g[u].push_back(v); } for(int i=1;i<=n;i++) if(flag[i]==0) dfs(i); printf("\n"); return 0; }
时间: 2024-10-11 14:07:10