図の深さ優先探索(隣接テーブル)
2580 ワード
Problem Description
図の頂点数と頂点と頂点との接続関係を示し、隣接テーブルで格納された図の深さ優先探索頂点シーケンスを出力します.
Input
入力された最初の行は、整数Tで試験例の数を表し、各例の最初の行には、2個の数m(2<=m<=10)とn(1<=n<=m*(m-1)/2)があり、mは頂点の数(頂点の符号は1-m)を表し、nは辺の数を表す.次のn行の各行は1つのエッジを表す.次の行は数kであり、kは検索する頂点の数を表す.後のk行の各行には、その頂点から検索を開始する数がある.検索中に同じ頂点に隣接する頂点を、格納された順に検索します.
Output
各グループはk行を出力し、各動作は入力された頂点から探索を開始する深さ優先探索シーケンスである.各グループの検索結果は空の行で区切られます.
Sample Input
1
2 1
1 2
2
1
2
Sample Output
1 2
2 1
// :#include
#include
#include
using namespace std;
int n,m,vis[15],cnt;
vector v[15];
void dfs(int x)
{
cnt++;
if(cnt if(cnt==m) printf("%d
",x);
for(int i=0;i {
if(v[x][i] && !vis[v[x][i]])
{
vis[v[x][i]]=1;
dfs(v[x][i]);
}
}
}
int main()
{
//freopen("a.txt","r",stdin);
int t,i,k,a,b,x;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
v[i].clear();
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
scanf("%d",&k);
for(i=1;i<=k;i++)
{
scanf("%d",&x);
memset(vis,0,sizeof(vis));
cnt=0;
vis[x]=1;
dfs(x);
}
if(t!=0) printf("
");
}
return 0;
}