java 图的邻接矩阵

有向图 在有向图中,结点对<x ,y>是有序的,结点对<x,y>称为从结点x到结点y的一条有向边,因此,<x,y>与<y,x>是两条不同的边。有向图中的结点对<x,y>用一对尖括号括起来,x是有向边的始点,y是有向边的终点,有向图中的边也称作弧。

无向图 在无向图中,结点对(x,y)是无序的,结点对(x,y)称为与结点x和结点y相关联的一条边。(x,y)等价于<x,y>和<y,x>。

完全图 在有n个结点的无向图中,若有n(n-1)/2条边,即任意两个结点之间有且只有一条边,则称此图为无向完全图。在有n个结点的有向图中,若有n(n-1)条边,即任意两个结点之间有且只有方向相反的两条边,则称此图为有向完全图。

邻接结点 在无向图G中,若(u,v)是E(G)中的一条边,则称u和v互为邻接结点,并称边(u,v)依附于结点u和v。在有向图G中,若<u,v>是E(G)中的一条边,则称结点u邻接到结点v,结点v邻接自结点u,并称边<u,v>和结点u和结点v相关联。

结点的度 结点v的度是与它相关联的边的条数,记作TD(v)。
路径 在图G=(V,E)中,若从结点vi出发有一组边使可到达结点vj,则称结点vi到结点vj的结点序列为从结点vi到结点vj的路径。

权 有些图的边附带有数据信息,这些附带的数据信息称为权。第i条边的权用符号wi表示。
路径长度 对于不带权的图,一条路径的路径长度是指该路径上的边的条数;对于带权的图,一条路径的路径长度是指该路径上各个边权值的总和。

最小生成树 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图联通的最少的边。(n-1)条边。

图的邻接矩阵存储结构
假设图G=(V,E)有n个结点,即V={v0,v1,…,vn-1},E可用如下形式的矩阵A描述,对于A中的每一个元素aij,满足:aij=1表示i和j节点有边相连,aij=0表示i和j没有边相连。
由于矩阵A中的元素aij表示了结点vi和结点vj之间边的关系,或者说,A中的元素aij表示了结点vi和结点vj(0≤j≤n-1)的邻接关系,所以矩阵A称作邻接矩阵。 aij=多少的数表示i和j的路径权值。

import java.util.ArrayList;

//邻接矩阵类
public class MyAdjGraphic {

    static final int maxWeight=-1; //如果两个结点之间没有边,权值为-1;
    ArrayList vertices = new ArrayList();//存放结点的集合
    int[][] edges; //邻接矩阵的二维数组
    int numOfEdges; //边的数量

    public MyAdjGraphic(int n)
    {
        edges = new int[n][n];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==j) //对角线上的元素为0
                {
                   edges[i][j]=0;
                }
                else
                {
                   edges[i][j]=maxWeight;
                }
            }
        }
        numOfEdges = 0;
    }

    //返回边的数量
    public int getNumOfEdges()
    {
        return this.numOfEdges;
    }

    //返回结点的数量
    public int getNumOfVertice()
    {
        return this.vertices.size();
    }

    //返回结点的值
    public Object getValueOfVertice(int index)
    {
        return this.vertices.get(index);
    }

    //获得某条边的权值
    public int getWeightOfEdges(int v1,int v2) throws Exception
    {
       if((v1 < 0 || v1 >= vertices.size())||(v2 < 0||v2 >= vertices.size()))
       {
           throw new Exception("v1或者v2参数越界错误!");
       }
       return this.edges[v1][v2];

    }

    //插入结点
    public void insertVertice(Object obj)
    {
        this.vertices.add(obj);
    }

    //插入带权值的边
    public void insertEdges(int v1,int v2,int weight) throws Exception
    {
        if((v1 < 0 || v1 >= vertices.size())||(v2 < 0||v2 >= vertices.size()))
        {
          throw new Exception("v1或者v2参数越界错误!");
        }

        this.edges[v1][v2]=weight;
        this.numOfEdges++;
    }

    //删除某条边
    public void deleteEdges(int v1,int v2) throws Exception
    {
        if((v1 < 0 || v1 >= vertices.size())||(v2 < 0||v2 >= vertices.size()))
        {
          throw new Exception("v1或者v2参数越界错误!");
        }
        if( v1==v2 || this.edges[v1][v2]==maxWeight)//自己到自己的边或者边不存在则不用删除。
        {
            throw new Exception("边不存在!");
        }

        this.edges[v1][v2]=maxWeight;
        this.numOfEdges--;
    }

    //打印邻接矩阵
    public void print()
    {
        for(int i=0;i<this.edges.length;i++ )
        {
            for(int j=0;j<this.edges[i].length;j++)
            {
                System.out.print(edges[i][j]+" ");
            }
            System.out.println();
        }
    }
}

//插入的边的类
public class Weight {

    int row;  //起点
    int col;  //终点
    int weight; //权值

    Weight(int row,int col,int weight)
    {
        this.row = row;
        this.col = col;
        this.weight = weight;
    }

    public static void createAdjGraphic(MyAdjGraphic g, Object[] vertices, int n,Weight[] weight,int e)
    throws Exception
    {
       //初始化结点
       for(int i=0;i<n;i++)
       {
           g.insertVertice(vertices[i]);
       }
       //初始化所有的边
       for(int i=0;i<e;i++)
       {
           g.insertEdges(weight[i].row, weight[i].col, weight[i].weight);
       }
    }
}

public class Test {

    public static void main(String[] args) {

        int n=5; //5个结点
        int e=5; //5条边

        MyAdjGraphic g = new MyAdjGraphic(n);
        Object[] vertices = new Object[]{new Character(‘A‘),new Character(‘B‘),new Character(‘C‘),new Character(‘D‘),new Character(‘E‘)};
        Weight[] weights = new Weight[]{new Weight(0,1,10),new Weight(0,4,20),new Weight(2,1,40),new Weight(1,3,30),new Weight(3,2,50)};
        try
        {
           Weight.createAdjGraphic(g, vertices, n, weights, e);
           System.out.println("--------该临街矩阵如下---------");
           g.print();
           System.out.println("结点的个数:"+g.getNumOfVertice());
           System.out.println("边的个数:"+g.getNumOfEdges());
           g.deleteEdges(0, 4);
           System.out.println("--------删除之后---------");
           g.print();
           System.out.println("结点的个数:"+g.getNumOfVertice());
           System.out.println("边的个数:"+g.getNumOfEdges());
        }
        catch(Exception ex)
        {

        }
    }

}
/*--------该临街矩阵如下---------
0 10 -1 -1 20
-1 0 -1 30 -1
-1 40 0 -1 -1
-1 -1 50 0 -1
-1 -1 -1 -1 0
结点的个数:5
边的个数:5
--------删除之后---------
0 10 -1 -1 -1
-1 0 -1 30 -1
-1 40 0 -1 -1
-1 -1 50 0 -1
-1 -1 -1 -1 0
结点的个数:5
边的个数:4*/
时间: 2024-10-08 19:16:32

java 图的邻接矩阵的相关文章

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

图的邻接矩阵存储

邻接表的构造与邻接矩阵完全不同,同学们应该发现了,邻接表的的结构更像是由几个链表构成的. 在构造邻接表时,我们的确会借助链表的结构.对图中每个顶点的信息,我们都会分别使用一个链表来进行存储. 因此,我们需要初始化一个有 n 个元素的链表数组,n 为图中顶点数量. 我们要在邻接表中存储的图的信息,实际上就是顶点之间存在的有向边. 当从顶点 a 到顶点 b 存在一条有向边时,我们只需要在头结点为 a 的链表后插入一个结点 b. 值得注意的是,当一条边是从顶点 b 到顶点 a 时,我们同样需要在以 b

数据结构(12) -- 图的邻接矩阵的DFS和BFS

//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS //////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> #include <queue> #define MaxVertexNum 100 //最大顶点数 //#define INFINI

Java图形化界面设计——容器(JFrame)

Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Java基本类(JFC) Java基本类(“JavaFoundationClasses”,JFC),由一些软件包组成.这些软件包主要包括下面一些应用程序接口(API): ·抽象窗口工具集(AWT)(1.1及以上版本). ·Swing构件. ·Java 2D应

三十三、Java图形化界面设计——布局管理器之null布局(空布局)

摘自http://blog.csdn.net/liujun13579/article/details/7774267 三十三.Java图形化界面设计--布局管理器之null布局(空布局) 一般容器都有默认布局方式,但是有时候需要精确指定各个组建的大小和位置,就需要用到空布局. 操作方法: 1)       首先利用setLayout(null)语句将容器的布局设置为null布局(空布局). 2)       再调用组件的setBounds(int x, int y, int width,int

三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)

摘自http://blog.csdn.net/liujun13579/article/details/7772491 三十一.Java图形化界面设计--布局管理器之GridLayout(网格布局) 网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式为:从上到下,从左到右. l  组件放入容器的次序决定了它在容器中的位置. l  容器大小改变时,组件

39.JAVA编程思想之外篇——JAVA图形化设计精简大全一文覆盖

39.JAVA编程思想之外篇--JAVA图形化设计精简大全一文覆盖 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51204948 目录 Java图形化界面设计--容器(JFrame)...1 Java基本类(JFC)...1 l     AWTAbstract Window Toolkit(AWT)抽象窗口工具包... 2 l     Swing包... 2 l     AWT和Swing的区别... 6 Swing基本框

二十七、Java图形化界面设计——容器(JFrame)

摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Java基本类(JFC) Java基本类("JavaFoundationClasses",JFC),由一些软件包组成.这些

三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)

摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) 卡片布局能够让多个组件共享同一个显示空间,共享空间的组件之间的关系就像一叠牌,组件叠在一起,初始时显示该空间中第一个添加的组件,通过CardLayout类提供的方法可以切换该空间中显示的组件. 1.  CardLayout类的常用构造函数及方法 2.  使用CardLayout类提供的方法可以切换显