数据结构---图

本文介绍了计算机科学中图的相关知识。图由顶点和边构成,是灵活的数据结构,可用于多种问题建模。阐述了图的组成、分类,主要以无向图为例,还介绍了图的表示方法,如链接矩阵、邻接表,最后给出了Graph接口的定义。

1.01 图

图(Graph)是由顶点和连接顶点的边构成的离散结构。在计算机科学中,图是最灵活的数据结构之一,很多问题都可以使用图模型进行建模求解。
例如:生态环境中不同物种的相互竞争、人与人之间的社交与关系网络、化学上用图区分结构不同但分子式相同的同分异构体、分析计算机网络的拓扑结构确定两台计算机是否可以通信、找到两个城市之间的最短路径等等。

图的两个重要组成部分

  • 结点Vertex
  • 边Edge
    在这里插入图片描述
    可以表示:交通运输,社区网络,互联网,工作安排,脑区活动,程序状态执行。

图的分类

  • 无向图
    在这里插入图片描述
  • 有向图
    在这里插入图片描述
    我们主要以无向图为主,无向图是一种特殊的有向图,所以讲来讲解的都是通用的操作
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    图的表示
  • 链接矩阵,用矩阵的方式表示图
    在这里插入图片描述
  • 邻接表,类似哈希表
    在这里插入图片描述
    Graph接口的定义
public interface Graph{
	public int V();	//返回节点个数
	public int E();	//返回边的个数
	public void addEdge(int v,int w);	//想图中添加一个边v-w或者v->w
	boolean hasEdge(int v,int w);	//验证图中是否有v到w的边
	void show();	//将图打印出来
	public Iterable<Integer> adj(int v);	//返回图中一个顶点的所有邻边
}

稠密图——邻接矩阵DenseGraph
//稠密图——邻接矩阵

public class DenseGraph implements Graph{
private int n; //节点数
private int m; //边数
private boolean directed;//是否为有向图
private boolean[][] g; //图的具体数据
//构造函数
public DenseGraph(int n,boolean directed){
if(n<0){
throw new IllegalArgumentExceptiion(“节点个数不能小于零!”);
}
this.n=n;
this.m=m; //初始化没有任何边
this.directed=directed;
//g初始化为n*n的布尔矩阵,每一个g[i][j]均为false。表示没有任何边
//false为Boolean型变量的默认值
g=new boolean[n][n];
}

//返回节点个数
public int V(){
	return n;
}

//返回边的个数
public int E(){
	return m;
}

//像图中添加一个边v-w或者v-w不管平行边
public void addEdge(int v,int w){
	if(v<0&&v>=n){
		throw new IllegalArgumentException("角标越界!");
	}
	if(w<0&&w>=n	){
		throw new IllegalArgumentException("角标越界!");
	}
	//先判断是否已经有边
	if(hasEdge(v,w))
		return;
	g[w][v]=true;	//有向图-单向
	if(!directed)
		g[w][v]=true;	//无向图-双向
	m++;
}

//验证图中是否有v到w的边
public boolean hasEdge(int v,int w){
	if(v<0&&v>=n){
		throw new IllegalArgumentException("角标越界");
	}
	if(w<0&&w>=m){
		throw new IllegalArgumentException("角标越界!");
	}
	return g[v][w];
}
//返回图中一个顶点的所有邻边
public Iterable<Integer>adj(int v){
	if(v<0&&v>=n){
		throw new IllegalArgumentException("角标越界");
	}
	Vector<Integer> adjV=new Vector<Integer>();
	for(int i=0;i<n;i++){
		if(g[v][i])
			adjV.add(i);
		return adjV;
	}
	
	public void show(){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				System.out.print((g[i][j]==true?1:0)+" ");
			System.out.println();
			}
		}
	}

稀疏图——邻接表SparseGraph

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值