图的建立与深度优先遍历

原文链接https://blog.csdn.net/Gamer_gyt/article/details/51498546

import com.sun.javafx.geom.Edge;
import com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl;

import java.util.Scanner;

//定义图结构
class Graph{
    static final int MaxNum = 20;
    static final int MaxValue = 65535;
    static Scanner scan = new Scanner(System.in);
    char[] Vertex = new char[MaxNum]; // 定义数组 保存节点信息  vertex是顶点最高点意思

    int GType; //图的类型 有向图和无向图
    int VertexNum; //顶点数量
    int EdgeNum; //变的数量

    int[][] EdgeWeight = new int[MaxNum][MaxNum]; //定义矩阵保存顶点信息
    int[] isTrave = new int[MaxNum]; //遍历标志

    //创建邻接矩阵图
    static void createGraph(Graph g){
        char EstartV,EndV;
        int weight;
        int i,j;
        System.out.println("开始输入各顶点信息啦");
        System.out.println();
        System.out.println("先输入所有的节点");
        for(i=0;i<g.VertexNum;i++){
            System.out.println("第"+(i+1)+"个顶点");
           // Scanner scan = new Scanner(System.in);
            g.Vertex[i] = (scan.next().toCharArray())[0];  //不是很懂
        }
        System.out.println("再输入所有边的权值");
        for (int k=0;k< g.EdgeNum;k++){
            System.out.println("第"+(k+1)+"条边");
            EstartV = scan.next().charAt(0);
            EndV = scan.next().charAt(0);
            weight = scan.nextInt();
            for(i=0;EstartV!=g.Vertex[i];i++);//在已有顶点中查找开始节点

            for (j=0;EndV!=g.VertexNum;j++);//在已有顶点中查找结束节点
            g.EdgeWeight[i][j] = weight; //对应位置保存权重,表示有一条边
            if(g.GType==0){  //如果是无向图 反过来在存一个
                g.EdgeWeight[j][i] = weight;
            }

        } ///这儿运行时候有问题,,,第二条,第三条边出不来;
    }

    //清空图
    static void clearGraph(Graph g){
        int i,j;
        for(i=0;i<g.VertexNum;i++){
            for(j=0;j<g.VertexNum;j++){
                g.EdgeWeight[i][j] = Graph.MaxValue;
            }
        }
    }

    //输出邻接矩阵
    static void OutGraph(Graph g){
        int i,j;
        for(j=0;j<g.VertexNum;j++){
            System.out.println("\t"+g.Vertex[j]);
        }System.out.println();

        for(i=0;i<g.VertexNum;i++){
            System.out.println(g.Vertex[i]);
            for(j=0;j<g.VertexNum;j++){
                if(g.EdgeWeight[i][j] == Graph.MaxNum)
                    System.out.println("\t Z");
                else{
                    System.out.println( "\t "+g.EdgeWeight[i][j]);

                }
                System.out.println();
            }
        }

    }

    //(被深度搜索调用的函数)
    static void DeepTraOne(Graph g,int n){//从第n个节点开始遍历
        int i;
        g.isTrave[n] = 1;   //从第n个开始,标明第n个已经遍历过了
        System.out.println("---->"+g.Vertex[n]);
        for(i=0;i<g.VertexNum;i++){
            if(g.EdgeWeight[n][i] !=g.MaxValue && g.isTrave[i]==0){
                DeepTraOne(g,i);
            }
        }

    }

    //深度优先遍历
    static void DeepTraGraph(Graph g){
        int i;
        for(i=0;i<g.VertexNum;i++){ //先把所有的初始化一下 不要待会乱掉了
            g.isTrave[i] = 0;
        }
        System.out.println("深度优先遍历0");
        for(i=0;i<g.VertexNum;i++){
            if(g.isTrave[i]==0) //若没有被输出过
                DeepTraOne(g,i);
        }
        System.out.println();
    }

}

class test{
    public static void main(String[] args) {
        Graph g = new Graph();
        Scanner scan = new Scanner(System.in);
        System.out.println("输出生成图的类型");
        g.GType =scan.nextInt();

        System.out.println("输入图定点数量");
        g.VertexNum = scan.nextInt();

        System.out.println("输入边的数量");
        g.EdgeNum = scan.nextInt();

        g.clearGraph(g);          //清空图
        g.createGraph(g);      //生成邻接表结构的图
        System.out.println("该图的邻接矩阵数据如下:");
        g.OutGraph(g);        //输出图
        g.DeepTraGraph(g);    //深度优先遍历图


    }

}

好像终于知道图的深度优先遍历的写法了,,在一个函数中调用另一个函数这种逻辑简单易懂,,但是运行的时候还有些问题,,

猜你喜欢

转载自blog.csdn.net/h_666666/article/details/85696801