图的表示与基础--Java

1.图的基础知识

该图片来自于: https://b23.tv/KHCF2m6

2.稀疏图与稠密图

G(V,E):V顶点个数,E边的个数

稀疏图:E<<V² 一般用邻接表表示(数组+链表)

稠密图:E接近V² 一般用邻接矩阵表示(二维数组)

3.图的两种表示

邻接表法:

java 复制代码
class Graph {
    int[][] matrix;
    int size;

    public Graph(int size) {
        this.size = size;
        matrix = new int[size][size];
    }

    public void addEdge(int from, int to) {
        matrix[from][to] = 1;
        matrix[to][from] = 1; // 如果是无向图,需要加上这一行
    }
    
    public void printGraph() {
		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix[i].length; j++) {
				System.out.print(matrix[i][j]+"  ");
			}
			System.out.println();
		}
	}
    
    public static void main(String[] args) {
		Graph graph = new Graph(5);
		graph.addEdge(0, 1);
		graph.addEdge(0, 2);
		graph.addEdge(0, 3);
		graph.addEdge(0, 4);
		
		graph.addEdge(1, 2);
		graph.addEdge(1, 3);
		graph.addEdge(1, 4);
		
		graph.addEdge(2, 3);
		graph.addEdge(2, 4);
		
		graph.addEdge(3, 4);
		graph.printGraph();
	}

邻接矩阵法:

java 复制代码
public class Graph2 {
    int V;	//图的顶点个数
    LinkedList<Integer> adjListArray[];//数组链表:数组位置存储的是链表,链表里的元素是Integer

    Graph2(int V) {
        this.V = V;

        adjListArray = new LinkedList[V];

        for (int i = 0; i < V; i++) {
            adjListArray[i] = new LinkedList<>();
        }
    }

    void addEdge(int src, int dest) {//添加边
        adjListArray[src].add(dest);
        adjListArray[dest].add(src); // 如果是无向图,需要加上这一行
    }

    void printGraph() {
        for (int v = 0; v < V; v++) {
            System.out.println("Adjacency list of vertex " + v);
            System.out.print("head");
            for (Integer pCrawl : adjListArray[v]) {
                System.out.print(" -> " + pCrawl);
            }
            System.out.println("\n");
        }
    }
    
    public static void main(String[] args) {
		Graph2 graph2 = new Graph2(5);
		System.out.println("顶点个数为:"+graph2.V);
		
		graph2.addEdge(0, 1);
		graph2.addEdge(0, 2);
		graph2.addEdge(0, 3);
		graph2.addEdge(0, 4);
		
		graph2.addEdge(1, 2);
		graph2.addEdge(1, 3);
		graph2.addEdge(1, 4);
		
		graph2.addEdge(2, 3);
		graph2.addEdge(2, 4);
		
		graph2.addEdge(3, 4);
		
		graph2.printGraph();
		
	}
}
相关推荐
Code季风14 分钟前
Spring 异常处理最佳实践:从基础配置到生产级应用
java·spring boot·spring
回家路上绕了弯15 分钟前
Java 堆深度解析:内存管理的核心战场
java·jvm
Code季风15 分钟前
Spring IoC 容器性能提升指南:启动速度与运行效率优化策略
java·spring·性能优化
谦行25 分钟前
前端视角 Java Web 入门手册 5.10:真实世界 Web 开发—— 单元测试
java·spring boot·后端
hhua012336 分钟前
理解“无界队列”与“有界队列”及其适用场景
java·队列
LZQqqqqo40 分钟前
C# 接口(interface 定义接口的关键字)
java·开发语言·c#
寒水馨1 小时前
Java 9 新特性解析
java·开发语言·新特性·java9·jdk9
SimonKing1 小时前
甩掉手动赋值!MyBatis-Plus 自动填充实战秘籍
java·后端·程序员
拓端研究室1 小时前
专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载
android·开发语言·kotlin
都叫我大帅哥1 小时前
Java PriorityQueue:小顶堆大智慧,优先队列全揭秘
java