前言:
这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
问题描述:
马上到寒假了,YHC准备去n大城市游玩。这些城市之间有些有航线,有些没有。由于YHC特别懒,现在他想请一位更更更更更蒟蒻的社长HBQ帮他查一下航线的数量,YHC在1号城市,输出所有他能游玩的城市编号。(小天才SZH提醒:请使用深度优先遍历)
输入描述
第一行:m和n,m代表城市数,n代表道路数量。
下面n行,每行两个数a、b,代表城市a、b之间有一条路。
输出描述
输出图的深度优先遍历
用例输入 1
5 5 1 2 1 3 1 5 2 4 3 5
用例输出 1
1 2 4 3 5
问题解析:
标准DFS代码
套用模板即可
注意不需要方向数组
代码部分:
首先是变量部分
#include<bits/stdc++.h>
using namespace std;
int a[10005][10005];
bool vis[10005];//记录是否走过
int n,m;
然后是DFS部分
void dfs(int step)
{
if(step>n) return;//出口
for(int i=1;i<=n;i++)
{
if(a[step][i]==0) continue;//判断是否有边
if(vis[i]) continue;//判断是否走过
vis[i]=true;//标记已走过
cout<<i<<" ";
dfs(i);//递归
}
return;
}
最后是主函数部分
int main()
{
int i,j,x,y;
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>x>>y;
a[x][y]=a[y][x]=1;//由于是双向图
}
memset(vis,false,sizeof(vis));//初始化
vis[1]=1;//起点标记
cout<<1<<" ";
dfs(1);//调用DFS
return 0;
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
int a[10005][10005];
bool vis[10005];
int n,m;
void dfs(int step)
{
if(step>n) return;
for(int i=1;i<=n;i++)
{
if(a[step][i]==0) continue;
if(vis[i]) continue;
vis[i]=true;
cout<<i<<" ";
dfs(i);
}
return;
}
int main()
{
int i,j,x,y;
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>x>>y;
a[x][y]=a[y][x]=1;
}
memset(vis,false,sizeof(vis));
vis[1]=1;
cout<<1<<" ";
dfs(1);
return 0;
}