dfs序
搜索 图的遍历
请输出一个图的使用深度优先搜索的顺序(先访问编号小的节点再访问编号大的节点)和每个顶点的间戳编号即这个顶点是第几个被访问到的
输入格式:
第一行的有两个整数n m ,n个顶点,m条边 接下来m行每行是一条类似“a b”这样的数据表示a号顶点和b号顶点之间可以相互到达
输出格式:
输出有两行 第一行是依次输出深度优先搜索的顺序每个顶点的编号用空格隔开 第二行输出每个顶点的时间戳编号即这个顶点是第几个被访问到的
限制:
1<=n<=1000 1<=m<=300000
样例 1 :
输入: 7 9 1 3 1 5 3 4 3 2 3 5 5 6 5 7 6 7 2 4
输出: 1 3 2 4 5 6 7 1 3 2 4 5 6 7
样例 2 :
输入: 13 18 1 5 1 4 3 2 5 2 6 2 2 12 6 7 3 7 3 8 7 8 10 6 6 11 10 11 12 13 12 9 13 9 4 2 5 6
输出: 1 4 2 3 7 6 5 10 11 8 12 9 13 1 3 4 2 7 6 5 10 12 8 9 11 13
解题思路:
本题涉及到图和搜索,为了更好理解,可以先将第一组数据储存到图里面(记住是无向图),然后再草稿纸上画出这个储存图的二维数组。这里我们用0来表示两点间没有路,1表示有路,下面看代码
#include <stdio.h>
int a[1001][1001];//定义一个二维数组,用来储存图
int book[1001]; //用来标记这个点是否搜索过
int time[1001],d[1001];//time记录每个点是第几个探测到的
int t=1,n,m;//d用来记录搜索到点的顺序
void dfs(int i)//传递需要搜索的下一个点
{
int j;
for(j=1;j<=n;j++)//对i这个点搜索
{
if(a[i][j]==1&&book[j]==0)
{
book[j]=1;
time[j]=t;
d[t++]=j;
dfs(j);
}
}
return ;
}
int main()
{
int i,j,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);//这里是无向图
a[x][y]=1;
a[y][x]=1;
}
time[1]=1;//初始化
d[1]=1;
t++;
book[1]=1;
dfs(1);//先从第一个点开始搜索
for(i=1;i<=n;i++)//输出数据
printf("%d ",d[i]);
putchar('\n');
for(i=1;i<=n;i++)
printf("%d ",time[i]);
return 0;
}
测题网站:https://www.acoj.com/problems/12370