文章目录
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