int h[maxn], cnt;struct{int to, ne;int w;} e[maxn];voidadd(int u,int v,int w){
cnt++;
e[cnt].to = v;
e[cnt].w = w;
e[cnt].ne = h[u];
h[u]= cnt;}intmain(){for(int i = h[1]; i; i=e[i].ne){}}
2.vector存图
structedge{int to, w;};
vector<edge> v[maxn];voidadd(int from,int to,int w){
v[from].push_back({to, w});}
拓扑排序
BFS
int n, m, cnt;int topo[maxn], in[maxn];voidbfs(){
queue<int> q;for(int i =1; i <= n; i++)if(!in[i])
q.push(i);while(!q.empty()){int a = q.front();
q.pop();
topo[++cnt]= a;for(int i = h[a]; i; i = ed[i].ne){int b = ed[i].to;if(--in[b]==0)
q.push(b);}}}intmain(){
cin >> n >> m;for(int i =1; i <= m; i++){int a, b;
cin >> a >> b;add(a, b);
in[b]++;}bfs();if(cnt < n)puts("有环");for(int i =1; i <= cnt; i++)
cout << topo[i];
cout << endl;}
DFS
int n, a[maxn], in[maxn];int topo[maxn];bool vis[maxn], dir[maxn][maxn];// dir[i][j]=true表示i、j是先后关系voiddfs(int z,int cnt){
topo[cnt]= z;if(cnt == n){for(int i =1; i <= n; i++)
cout << topo[i];
cout << endl;return;}
vis[z]=true;for(int i =1; i <= n; i++){if(!vis[a[i]]&& dir[z][a[i]])
in[a[i]]--;}for(int i =1; i <= n; i++){if(!in[a[i]]&&!vis[a[i]])dfs(a[i], cnt +1);}for(int i =1; i <= n; i++){if(!vis[a[i]]&& dir[z][a[i]])
in[a[i]]++;}
vis[z]=false;}intmain(){
cin >> n;for(int i =1; i <= n; i++)
cin >> a[i];bool flag =true;for(int i =1; i <= n; i++){int st, ed;if(flag){
flag =!flag;
cin >> st;continue;}if(!flag){
flag =!flag;
cin >> ed;
dir[st][ed]=1;
in[ed]++;continue;}}for(int i =1; i <= n; i++)if(!in[a[i]])dfs(a[i],1);}