JAVA实现数据结构:图

这篇博客详细介绍了图的基本概念,包括无向图、有向图、连通图等,并探讨了图的三种存储结构:邻接矩阵、邻接表和边集数组。深度优先搜索(DFS)和广度优先搜索(BFS)的实现也在文中进行了讲解,通过邻接矩阵和邻接表两种方式展示了遍历算法。
摘要由CSDN通过智能技术生成

1.图的基本概念

按照有无方向分为无向图有向图。无向图由顶点构成,有向图由顶点构成.弧有弧尾弧头之分,
图按照边或弧的多少分稀疏图穉密图。如果任意两个顶点之间都存在边叫完全
,有向的叫有向完全围。若无重复的边或顶点到自身的边则叫简单图
图中顶点之间有邻接点依附的槪念。无向图顶点的边数叫做,有向图顶点分
入度出度
图上的边或弧上带权则称为
图中顶点间存在路径,两顶点存在路径则说明是连通的,如果路径最终回到起始
点则称为,当中不重复叫简单路径。若任意两顶点都是连通的,则图就是连通图,有向则称强连通图,图中有子图,若子图极大连通则就是连通分量,有向的则称强连通分量
无向图中连通且n个顶点n-1条边生成树。有向图中一顶点入度为0其余顶 点入度为1的叫有向树。一个有向图由若干棵有向树构成生成森林

2.图的存储结构

2.1邻接矩阵

2.1.1无向图的邻接矩阵实现

//1 无向图的邻接矩阵实现  空间复杂度:O(n^2)

import java.util.Scanner;

public class Graph<E>  {
   
	int vexnum;//顶点数
	int arcnum;//边数
	E[] vexs;//顶点表
	E[][] arc;//邻接矩阵
	
	
	public Graph(int vexnum,int arcnum) {
   
		this.arcnum=arcnum;
		this.vexnum=vexnum;
		vexs=(E[])new Object[vexnum];
		arc=(E[][])new Object[vexnum][vexnum];	
	}
	public void CreateMGraph() {
   
		int i,j,k;
		E w;
		Scanner in=new Scanner(System.in);
		System.out.println("请循序输入顶点值,记住他们的位置");
		for(i=0;i<vexnum;i++  ) {
   
			vexs[i]=(E)in.next();
		}
		System.out.println("请循序输入边(vi,vj)的顶点下标和权值");
		for(k=0;k<arcnum;k++  ) {
   
			i=in.nextInt();
			j=in.nextInt();
			w=(E)in.next();
			arc[i][j]=w;
			arc[j][i]=w;//因为是无向图,矩阵对称
		}
	}
	public void print() {
   
		for(int i=0;i<vexnum;i++  ) {
   
			for(int j=0;j<vexnum;j ++ ) {
   
				System.out.print(arc[i][j]+ "\t");
			}
			System.out.println();
	}
}
}
	public static void main(String[] args) {
   
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入图的顶点数和边数");
		int vexnum=sc.nextInt();
		int arcnum=sc.nextInt();
		Graph<Integer> map=new Graph<Integer>(vexnum, arcnum);
		map.CreateMGraph();
		map.print();
		}
}

在这里插入图片描述

2.1.2有向图的邻接矩阵实现

//2 有向图的邻接矩阵实现  空间复杂度:O(n^2)

import java.util.Scanner;

public class Graph<E>  {
   
	int vexnum;//顶点数
	int arcnum;//边数
	E[] vexs;//顶点表
	E[][] arc;//邻接矩阵
	
	
	public Graph(int vexnum,int arcnum) {
   
		this.arcnum=arcnum;
		this.vexnum=vexnum;
		vexs=(E[])new Object[vexnum];
		arc=(E[][])new Object[vexnum][vexnum];	
	}
	public void CreateMGraph() {
   
		int i,j,k;
		E w;
		Scanner in=new Scanner(System.in);
		System.out.println("请循序输入顶点值,记住他们的位置");
		for(i=0;i<vexnum;i++  ) {
   
			vexs[i]=(E)in.next();
		}
		System.out.println("请循序输入边<vi,vj>的顶点下标和权值");//区别1,有向图用<>表示
		for(k=0;k<arcnum;k++  ) {
   
			i=in.nextInt();
			j=in.nextInt();
			w=(E)in.next();
			arc[i][j]=w;//区别2,有向图不是对称的
		}
	}
	public void print() {
   
		for(int i=0;i<vexnum;i++  ) {
   
			for(int j=0;j<vexnum;j++  ) {
   
				System.out.print(arc[i][j] +"\t");
			}
			System.out.println();
	}
}
	public static void main(String[] args) {
   
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入图的顶点数和边数");
		int vexnum=sc.nextInt();
		int arcnum
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值