#课堂上老师给出的思路
#示例:
#代码及结果
public class T1_12_2021 {
public int nodeNum; //结点数量
public int edgeNum; //边的数量
public int node[]=new int[9]; //邻接矩阵的点
public int edge[][]= new int[9][9];//邻接矩阵的边的集合
public boolean visited[]=new boolean[9];
public T1_12_2021()
{
nodeNum=9;
edgeNum=10;
//初始化结点
for(int i=0;i<nodeNum;i++)
{
node[i]=i+1;
visited[i]=false;
}
//初始化边
edge[0][1]=edge[1][0]=1;
edge[0][2]=edge[2][0]=1;
edge[1][3]=edge[3][1]=1;
edge[1][4]=edge[4][1]=1;
edge[3][7]=edge[7][3]=1;
edge[4][7]=edge[7][4]=1;
edge[7][8]=edge[8][7]=1;
edge[2][5]=edge[5][2]=1;
edge[2][6]=edge[6][2]=1;
edge[5][6]=edge[6][5]=1;
}
//输出图
public void printGraph()
{
System.out.print("该图输出为:\n ");
for(int i=0;i<nodeNum;i++)
{
System.out.print(node[i]+" ");
}
System.out.println();
for(int i=0;i<nodeNum;i++)
{
System.out.print(node[i]+" ");
for(int j=0;j<nodeNum;j++)
{
System.out.print(edge[i][j]+" ");
}
System.out.println();
}
System.out.println();
}
public void DFS(int v)
{//表示从顶点v开始深度遍历
int i,w;
i=LocateVex(v);//获取顶点v的序号
if(visited[i]==false)
{//如果顶点v没有被访问过
System.out.print(node[i]+" ");
visited[i]=true;
}
w=FirstAdjVex(v);//寻找结点v的第一个邻接节点的序号
while(w>0)
{
if(visited[w]==false)
{//如果序号为w的结点没有被访问
DFS(node[w]);
}
w=NextAdjVex(v,w);//获得图中v顶点的序号为w的邻接顶点之后的下一个顶点的序号
}
}
public int NextAdjVex(int v,int w)
{//获得图中v顶点的序号为w的邻接顶点之后的下一个顶点的序号
int j=LocateVex(v);
for(int i=w+1;i<nodeNum;i++)
{
if(edge[j][i]!=0)
return i;
}
return -1;
}
public int FirstAdjVex(int v)
{//寻找结点v的第一个邻接节点的序号
int j=LocateVex(v);
for(int i=0;i<nodeNum;i++)
{
if(edge[j][i]!=0 && visited[i]==false)
return i;
}
return -1;
}
public int LocateVex(int v)
{
int pos=-1;
for(int i=0;i<nodeNum;i++)
{
if(node[i]==v)
{
pos=i;
return pos;
}
}
return pos;
}
public static void main(String args[])
{
T1_12_2021 m=new T1_12_2021();
m.printGraph();
m.DFS(1);
}
}
最终结果为:1 2 4 8 5 9 3 6 7