无向连接图:
用深度优先搜索的策略从1开始遍历,其结果如下:
1->2->3->5->4->6->7->8
代码:
递归方式实现
package 深度遍历;
public class First {
static int s=Integer.MAX_VALUE;//用于表示两个顶点不相连
//以二维数组的形式保存图 一共有8个顶点
static int G[][]={{0,0,0,0,0,0,0,0,0},
{1,s,1,1,s,1,s,s,s},
{2,1,s,s,s,s,s,s,s},
{3,1,s,s,s,1,1,s,s},
{4,s,s,s,s,1,s,s,s},
{5,s,s,1,1,s,s,s,s},
{6,s,s,1,s,s,s,1,1},
{7,s,s,s,s,s,1,s,s},
{8,s,s,s,s,s,1,s,s}};
static int d=0;
static int color[]={1,1,1,1,1,1,1,1,1};//1表示未访问,2表示已访问,3表示相邻节点都被访问过了
public static void main(String[] args){
for(int i=1;i<=8;i++){
dfs(G,i);
}
}
private static void dfs(int[][] g, int i) {
if(color[i]==1){
color[i]=2;
d++;
if(d!=8)
System.out.print(i+"->");
else
System.out.print(i);
for(int j=1;j<=8;j++){
if(color[j]==1&&g[i][j]==1){//当未被访问,且与i顶点相连
dfs(g,j);
}
}
color[i]=3;
}
}
}
栈方式实现
package 深度遍历;
import java.util.LinkedList;
public class 栈实现 {
static int visite[]=new int[9];
static int G[][]={{0},
{2,3,5},
{1},
{1,5,6},
{5},
{3,4},
{3,7,8},
{6},
{6}};
public static void main(String[] args){
Mstack mstack=new Mstack();
mstack.push(1);
while (!mstack.isEmpty()){
int v=mstack.peek();
if(visite[v]!=1){
System.out.print(v+"->");
visite[v]=1;
}
int next=lingjie(v);//如果lingjie函数返回值为0,说明v点没有相邻点或者相邻点都被访问过了
if(next!=0)
mstack.push(next);
else
mstack.pop();
}
}
//用于取出V点相邻近且未被访问过的顶点
public static int lingjie(int v) {
for(int i=0;i<G[v].length;i++){
if(visite[G[v][i]]!=1)
return G[v][i];
}
return 0;
}
}
class Mstack{
private LinkedList<Integer> linkedList=new LinkedList<Integer>();
public void push(int e){
linkedList.addFirst(e);
}
public int pop(){
return linkedList.removeFirst();
}
public int peek(){
return linkedList.getFirst();
}
public boolean isEmpty(){
return linkedList.isEmpty();
}
}