描述
给出一个 n 个顶点的有向图,顶点编号从 1∼n。
从 1 号顶点出发,求该图每个顶点的 pre 值和 post 值。
为了使本题的答案唯一,规定:当一个顶点发出多条弧的时候,按顶点的编号,从小到大进行遍历。本题已写好validator,所以可以取消这个限制
温馨提示:时钟从 1 开始。
输入描述
第一行给出这个图的顶点数 n (1≤n≤750)
第二行给出这个有向图的边数 e (0≤e≤100000)
第三行开始,共 e 行,每行两个正整数 a b,表示从顶点 a 发出一条弧到顶点 b 。
输出描述
两行,第一行:1 号顶点的 pre 值,2 号顶点的 pre 值,…,n 号顶点的 pre 值。每个值后面跟一个空格。
第二行:1 号顶点的 post 值,2 号顶点的 post 值,…,n 号顶点的 post 值。每个值后面跟一个空格。
用例输入 1
8 11 1 2 2 3 3 4 4 1 5 6 6 7 7 8 8 5 4 2 5 7 2 5
用例输出 1
1 2 3 4 7 8 9 10 16 15 6 5 14 13 12 11
#include<iostream>
using namespace std;
int n,m;
int a[1010][1010];
int c=1;
int post[1010],pre[1010],v[1010];
void dfs(int i){
v[i]=1;
pre[i]=c++;
for(int j=1;j<=n;j++){
if(a[i][j]==1&&!v[j]){
dfs(j);
}
}
post[i]=c++;
}
int main(){
cin>>n;
cin>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
a[x][y]=1;
}
dfs(1);
for(int i=1;i<=n;i++){
cout<<pre[i]<<" ";
}
cout<<endl;
for(int i=1;i<=n;i++){
cout<<post[i]<<" ";
}
return 0;
}