有向图 在有向图中,结点对<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;
ArrayList vertices = new ArrayList();//存放结点的集合
int[][] edges; //邻接矩阵的二维数组
int numOfEdges; //边的数量 public MyAdjGraphic(int n)
{
edges = new int[n][n];
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
if(i==j) //对角线上的元素为0
{
edges[i][j]=;
}
else
{
edges[i][j]=maxWeight;
}
}
}
numOfEdges = ;
} //返回边的数量
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 < || v1 >= vertices.size())||(v2 < ||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 < || v1 >= vertices.size())||(v2 < ||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 < || v1 >= vertices.size())||(v2 < ||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=;i<this.edges.length;i++ )
{
for(int j=;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=;i<n;i++)
{
g.insertVertice(vertices[i]);
}
//初始化所有的边
for(int i=;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个结点
int e=; //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(,,),new Weight(,,),new Weight(,,),new Weight(,,),new Weight(,,)};
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(, );
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*/

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

  1. Java图的邻接矩阵实现

    /** * * 图的邻接矩阵实现 * @author John * * @param <T> */ class AMWGraph<T> { private ArrayList& ...

  2. 数据结构Java版之邻接矩阵实现图(十一)

    邻接矩阵实现图,是用一个矩阵,把矩阵下标作为一个顶点,如果顶点与顶点之间有边.那么在矩阵对应的点上把值设为 1 .(默认是0) package mygraph; import java.util.Li ...

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

    //////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...

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

    转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...

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

    摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...

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

    摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...

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

    摘自http://blog.csdn.net/liujun13579/article/details/7774267 三十三.Java图形化界面设计--布局管理器之null布局(空布局) 一般容器都有 ...

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

    摘自http://blog.csdn.net/liujun13579/article/details/7772491 三十一.Java图形化界面设计--布局管理器之GridLayout(网格布局) 网 ...

  9. 图的邻接矩阵实现(c)

    参考:算法:c语言实现 一书 图的邻接矩阵实现 #ifndef GRAPH #define GRAPH /* 图的邻接矩阵实现 */ #include<stdio.h> #include& ...

随机推荐

  1. 关于微信聊天与朋友圈如何快速切换 Mark

    用微信时,你是否遇到这样的情况.你正刷着朋友圈,享受着各种鸡汤,这时候,你收到一条微信,一看是女王大人,不得不回.你诚恳的回了一条,等了二十秒不见有什么回应,于是就退了出来,进入朋友圈找到那篇没看完的 ...

  2. C#/.net给textbox添加回车事件

    前端js代码,放到<head>标签下 <script type="text/javascript"> function EnterTextBox(butto ...

  3. ubuntu ip

    一.使用命令设置Ubuntu IP地址 1.修改配置文件blacklist.conf禁用IPV6 sudo vi /etc/modprobe.d/blacklist.conf 在文档最后添加 blac ...

  4. 25个让人无法抗拒的HTML5网站设计实例

    原文地址:http://www.goodfav.com/html5-website-designs-8272.html HTML5在其功能方面给网络市场带来了惊人的改进. HTML5是万维网联盟,在起 ...

  5. 第三百五十六天 how can I 坚持

    一年了,三百五十六天.写个算法算下对不对. 今天突然想买辆自行车了.云马智行车,还是捷安特,好想买一辆. 网好卡.貌似少记了一天呢,357了.好快. 睡觉了,还没锻炼呢,太晚了. 1458748800 ...

  6. 我的第一个CUDA程序

    最近在学习CUDA框架,折腾了一个多月终于把CUDA安装完毕,现在终于跑通了自己的一个CUDA的Hello world程序,值得欣喜~ 首先,关于CUDA的初始化,代码和解释如下,这部分主要参考GXW ...

  7. 前端异步解决方案——mmDeferred

    Deferred是前端解决异步操作的一种编程范式,后来出现的Promise规范更是让其普适性大大提高.不过Promise规范也存在分岐.现在最流行的是Promise/A规范. Promise/A大致是 ...

  8. VISIO 2007 修改形状默认字体 自定义模具

    visio 2007的形状的默认字体为8号,比较小,怎样改成默认10号? 首先将一个流程图中所要用的形状都拖到绘图区,然后全选,设置字体为10号,全选,再拖动到形状区,如下图: 点击‘是’,确认修改模 ...

  9. C#中DllImport用法和路径问题

    DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息.    DllImport属性应用于方法,要 ...

  10. 错误"因为数据库正在使用,所以无法获得对数据库的独占访问权"的解决方案

    今天在还原数据库的时候,提示"因为数据库正在使用,所以无法获得对数据库的独占访问权",无论我是重启数据库,还是重启计算机,都不能解决问题,多番尝试后,终于解决了该问题.现将引发该问 ...