输入格式
第一行:输入0到3之间整数(有向图:0,有向网:1,无向图:2,无向网:3);
第二行:输入顶点数和边数;
第三行:输入各个顶点的值(字符型,长度〈3);(遍历从输入的第一个顶点开始)
第四行:输入每条弧(边)弧尾和弧头(以空格作为间隔),如果是网还要输入权值;
输出格式
输出对图深度遍历的结果。
输入样例
0
3 3
a b c
a b
b c
c b
输出样例
a b c
提示
注意题目的邻接表采用的是头插法,也就是后出现的边节点先被访问。
代码如下:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<int> e[10005];
int v[10005];//访问数组
int n,m,kind;
void dfs(int x,int y)
{
cout<<char(x+'a')<<" ";
for (int i=0;i<e[x].size();i++)
{
int nextad=e[x][i];
if(v[nextad])//判断是否访问过
continue;
if (nextad==y)//判断是否重复访问
continue;
v[nextad]=1;
dfs(nextad,x);
}
}
int main()
{
int i,firstaj;
scanf("%d%d%d",&kind,&n,&m);
char ch;
for (i=0;i<n;i++)
cin>>ch;
for (i=1;i<=m;i++)
{
char c1,c2;
cin>>c1>>c2;
int x=c1-'a';
int y=c2-'a';
if (i==1)
firstaj=x;
if (kind<=1)//有向图
{
e[x].insert(e[x].begin(),y);//头插
}
else// 无向图
{
e[x].insert(e[x].begin(),y);//头插
e[y].insert(e[y].begin(),x);
}
}
v[firstaj]=1;
dfs(firstaj,-1);
return 0;
}