//深度优先搜索算法
//procedure DFS(G:带顶点v1,...vn的连通图)
//T:=只包含顶点v1的树
//visit(v1)
//------------------------------------//
//procedure visit(v:G的顶点)
//for 与v相邻并且还不在T中的每个顶点w
//begin
// 加入顶点w和边{v,w}到T
// visit(w)
//end
#include <iostream>
using namespace std;
//012345分别表示v0 v1......
int v;//点数目
int edge;///边数目
int j=0;
int** draw(int* &t);//绘图
void DFS(int **a,int head,int *T);//深度优先搜索
void visit(int **a,int head,int *T);//visit
int no_T(int num,int *T);//判断是否访问过了
int main(int argc, char const *argv[])
{
int *T;
int**a=draw(T);
//------------------------------------------------------------------------//
for (int i = 0; i < v; ++i)//v个访问始点
{
j=0;
DFS(a,i,T);
cout<<endl;
}
delete []a;
delete []T;
return 0;
}
int** draw(int* &t)//绘图
{
int i,j;
cin>>v>>edge;///输入点数目和边数目
int **a=new int*[v];
for ( i = 0; i < v; ++i)
a[i]=new int[v];
t=new int[v+1];
for ( i = 0; i < v; ++i)
for ( j = 0; j < v; ++j)
a[i][j]=0;
int spot1,spot2;
for ( i = 0; i < edge; ++i)
{
cin>>spot1>>spot2;
a[spot1][spot2]++; a[spot2][spot1]++;
}
///-------------------------------------------------------------///
for ( i = 0; i < v; ++i)
{
for ( j = 0; j < v; ++j)
{
cout<<a[i][j]<<" ";
}
cout<<"\n";
}
cout<<"\n";
return a;
}
void DFS(int **a,int head,int *T)
{
cout<<head<<" ";//始点
T[j++]=head;
visit(a,head,T);
}
void visit(int **a,int head,int *T)
{
for (int i = 0; i < v; ++i)
{
if(a[head][i]!=0 && no_T(i,T))//有路并且未访问过
{
cout<<i<<" ";
T[j++]=i;
visit(a,i,T);
}
}
}
int no_T(int num,int *T)
{
for (int i = 0; i < j; ++i)
{
if (num==T[i])
return 0;
}
return 1;
}
/*
5
7
0 1
0 2
0 3
1 4
1 3
2 3
3 4
图
0 1 1 1 0
1 0 0 1 1
1 0 0 1 0
1 1 1 0 1
0 1 0 1 0
v个结点
0 1 3 2 4
1 0 2 3 4
2 0 1 3 4
3 0 1 4 2
4 1 0 2 3
Press any key to continue
*/
深度优先搜索_基于邻接矩阵
最新推荐文章于 2023-12-05 09:10:12 发布