数据结构之图说

:图结构是一种非线性结构,如:通信网络,交通网络,人际关系网

什么是图结构:每一个数据元素之间可以人衣服相关联。

典型的图结构包括:顶点(数据元素)和边(链接顶点的线)

G=(V,E) V:表示所有顶点的集合 E:表示所有边的集合

图的基本概念

  • 无向图:所有边都是没有方向性的,便称为无向图
  • 有向图:所有的边都是有向性的,与无向图相反
  • 顶点的度(degree):连接该顶点的边的数量为该顶点的度
    • 出度:该顶点为端点的出边数量
    • 入度:该顶点为端点的入边数量
  • 邻接顶点:一条边的两个顶点
  • 无向完全:每一个顶点之间都存在一条边
  • 有向完全图:每个顶点之间都存在方向相反的两条边
  • 子图:一个子图的顶点和边都应该是另一个图的集合
  • 路径:两个顶点之间的连线
  • 环:路径的第一个顶点和最后一个顶点是相同的
  • 回路:路径的第一个顶点和最后一个顶点是相同的
  • 连通图,连通分量:无向图中任意两点都是连通的
    -强连通图:有向图中任意两点都是连通的
  • 权:对边赋予某种含义,在实际中将边表示成某种数值,这个数值叫做权
  • 网:带有权值的图

图的实现

顶点之间是多对多的关系,无法将顶点映射到内存
采用结构数组的形式来单独保存顶点信息,然后采用二维数组的形式保存顶点之间的关系(保存顶点之间的关系的也称作邻接矩阵)

Class CraphMatrix{
    static final int MaxNum = 20;
    static final int MaxValue = 65535;
    char[] Vertex = new char[MaxNum];    //保存边的信息
    int GType;          //图的类型[0为无向图,1为有向图]
    int VertexNum;      //顶点的数量
    int EdgeNum;        //边的数量
    int[][] EdgeWeight = new int[MaxNum][MaxNum];
    int[][] isTrav = new int[MaxNum];
}

public class G{
    static Scanner input = new Scanner(System.in);
    static void CreateGrap(GraphMatrix GM){
        int i,j,k;
        int weight;
        char EstartV,EndV;    //边的起始顶点
        System.out.println("输入途中个顶点信息\n");
        for(i = 0; i < GM.VetexNum; i++){
            System.out.printf("第%d个顶点:" ,i + 1);
            GM.Vetex[i] = (input.next().toCharArray())[0];      //保存个顶点到数组元素中
            System.out.println("输入各个边的顶点及权值:\n");
            for(k = 0; k < GM.EdgeNum; k++){
                System.out.printf("第%d条边:" k+1);
                EstartV = input.next().charAt(0);
                EendtV = input.next().charAt(0);    
                weight = input.nextInt();
                for(i = 0;EstartV != GM.Vetex[i]; i++);
                for(j = 0;EendV != GM.Vetex[j]; j++);
                GM.EdgeWeight[i][j] = weight;
                if(GM.Gtype == 0){ //若是无向图
                    GM.EdgeWeight[j][i] = weight;    //在对角的地方保存权值
                }
            }           
        }
        static void ClearGrap(GraphMatrix GM){
            int i,j;
            for(i = 0; i < GM.VetexNum; i++){  //清空矩阵
                for(j = 0; j < GM.VetexNum; j++){
                    GM.EdgeWeight[i][j] = GraphMatrix.MaxValue; 
                }
            }
        }
        static void OutGraph(GraphMatrix GM){
            int i,j;
            for(j = 0; j < GM.VetexNum; j++){
                System.out.printf("\t%c",GM.Vetex[j]);  
            }
            System.out.println();
            for(i = 0; i < GM.VetexNum; i++){
                System.out.println("%c", GM.EdgeVetex[i]);
                for(int j = 0; j < GM.VetexNum; j++){
                        if(GM.EdgeWeight[i][j] == GraphMatrix.MaxValue){
                        System.out.printf("\tZ");
                    }else{
                        System.out.printf("\t%d",GM.EdgeWeight[i][j]);
                    }
                }
                System.out.println();
            }
        }
        static void DeepTraOne(GraphMatrix GM, int n){}
        static void DeepTraGraph(GraphMaxtrix GM){}
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值