邻接矩阵存储从入门到精通,手把手教你用C语言实现图操作

第一章:图的基本概念与邻接矩阵概述

图是计算机科学中用于表示对象之间关系的重要数据结构。它由一组顶点(或称为节点)和一组连接这些顶点的边组成。根据边是否有方向,图可分为有向图和无向图;若边具有数值属性,则称为带权图。图广泛应用于社交网络分析、路径规划、推荐系统等领域。

图的核心组成要素

  • 顶点(Vertex):表示图中的一个基本单元,如城市、用户等。
  • 边(Edge):连接两个顶点的关系,可以是有向或无向的。
  • 权重(Weight):边上的数值,常用于表示距离、成本等。

邻接矩阵的表示方法

邻接矩阵是一种用二维数组表示图的方式。对于包含 n 个顶点的图,使用一个 n×n 的矩阵 graph,其中:
  • 若存在从顶点 i 到 j 的边,则 graph[i][j] = 1(或权重值);
  • 否则为 0。
对于无向图,邻接矩阵是对称的。这种方式便于快速判断两顶点间是否存在边,但空间复杂度为 O(n²),在稀疏图中可能造成存储浪费。
顶点ABC
A011
B100
C100
// Go语言中定义一个简单的邻接矩阵
package main

import "fmt"

func main() {
    // 3x3 邻接矩阵表示无向图 A-B, A-C
    graph := [][]int{
        {0, 1, 1}, // A 连接到 B 和 C
        {1, 0, 0}, // B 只连接到 A
        {1, 0, 0}, // C 只连接到 A
    }

    fmt.Println("Adjacency Matrix:")
    for _, row := range graph {
        fmt.Println(row)
    }
}
graph TD A --> B A --> C B --> A C --> A

第二章:邻接矩阵的结构设计与初始化

2.1 图的数学定义与邻接矩阵表示原理

图在数学上被定义为一个二元组 $ G = (V, E) $,其中 $ V $ 是顶点的有限集合,$ E \subseteq V \times V $ 是边的集合。根据边是否有方向,图可分为有向图和无向图。
邻接矩阵的基本结构
邻接矩阵使用二维数组 $ A $ 表示图中顶点间的连接关系。若图包含 $ n $ 个顶点,则矩阵维度为 $ n \times n $,其中: $$ A[i][j] = \begin{cases} 1, & \text{若存在从 } i \text{ 到 } j \text{ 的边} \\ 0, & \text{否则} \end{cases} $$
  • 无向图的邻接矩阵是对称的
  • 有向图的矩阵可能不对称
  • 自环对应对角线元素
代码实现示例
type Graph struct {
    vertices int
    matrix   [][]int
}

func NewGraph(n int) *Graph {
    mat := make([][]int, n)
    for i := range mat {
        mat[i] = make([]int, n)
    }
    return &Graph{n, mat}
}

func (g *Graph) AddEdge(u, v int) {
    g.matrix[u][v] = 1 // 设置边存在
}
该Go语言结构体使用二维切片存储邻接矩阵,AddEdge方法在指定位置置1,表示边的存在。矩阵初始化时间复杂度为 $ O(n^2) $,适合稠密图的表示。

2.2 C语言中邻接矩阵的数据结构设计

在C语言中,邻接矩阵通常采用二维数组实现,用于表示图中顶点之间的连接关系。该结构适用于稠密图,访问任意边的时间复杂度为O(1)。
基本结构定义

#define MAX_VERTICES 100

typedef struct {
    int vertices;                       // 顶点数量
    int adjMatrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
} Graph;
上述代码定义了一个图结构体,其中 adjMatrix[i][j] 表示从顶点 i 到顶点 j 是否存在边。初始化时所有元素设为0,有边则置为1(或边的权重)。
初始化操作
  • 分配图结构内存,设置顶点数
  • 将邻接矩阵所有元素初始化为0(无边状态)
  • 支持后续动态添加边(设置对应矩阵元素值)

2.3 图的初始化与顶点边关系建模

在构建图结构时,首要步骤是完成图的初始化,并建立顶点与边之间的逻辑关系。通常使用邻接表或邻接矩阵来表示图。
邻接表实现方式

type Graph struct {
    vertices map[int][]int
}

func NewGraph() *Graph {
    return &Graph{vertices: make(map[int][]int)}
}

func (g *Graph) AddEdge(u, v int) {
    g.vertices[u] = append(g.vertices[u], v)
}
上述代码定义了一个基于哈希表的无向图结构,AddEdge 方法用于添加有向边。g.vertices[u] 存储从顶点 u 可达的所有相邻顶点。
顶点与边的数据组织
  • 邻接表节省空间,适合稀疏图;
  • 邻接矩阵便于判断边的存在性,适用于稠密图;
  • 加权边可通过 map[int]map[int]int 表示。

2.4 无向图与有向图的矩阵构建差异

在图论中,邻接矩阵是表示图结构的重要方式。无向图和有向图在矩阵构建上的核心差异体现在对称性上。
邻接矩阵的对称性特征
无向图的邻接矩阵是对称的,即 A[i][j] = A[j][i],因为边没有方向。而有向图的邻接矩阵通常不对称,边 i → j 存在并不代表 j → i 也存在。
# 无向图邻接矩阵示例(对称)
adj_undirected = [
    [0, 1, 1],
    [1, 0, 0],
    [1, 0, 0]
]

# 有向图邻接矩阵示例(非对称)
adj_directed = [
    [0, 1, 0],
    [0, 0, 1],
    [1, 0, 0]
]
上述代码展示了两种图的矩阵构造方式。无向图中节点0与1、2相连,因此矩阵关于主对角线对称;有向图中边具有方向性,矩阵无需满足对称性。
构建差异对比
特性无向图有向图
矩阵对称性是否
边存储方式双向记录单向记录

2.5 实战:用C实现图的创建与初始化

邻接矩阵表示法
在C语言中,使用二维数组实现邻接矩阵是图初始化的常用方式。该结构适合稠密图,访问边的时间复杂度为O(1)。
#define MAX_VERTICES 100
typedef struct {
    int vertices;
    int adjMatrix[MAX_VERTICES][MAX_VERTICES];
} Graph;

Graph* createGraph(int n) {
    Graph* g = (Graph*)malloc(sizeof(Graph));
    g->vertices = n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            g->adjMatrix[i][j] = 0;
    return g;
}
上述代码中,`createGraph`函数动态分配图结构内存,并将邻接矩阵所有元素初始化为0,表示无边。`vertices`字段记录顶点数量,便于后续遍历操作。
适用场景对比
  • 邻接矩阵:适合顶点数较少且边密集的图
  • 邻接表:节省空间,适合稀疏图

第三章:基于邻接矩阵的图操作实现

3.1 插入顶点与添加边的操作逻辑

在图结构中,插入顶点和添加边是构建网络关系的基础操作。首先,插入顶点需确保唯一性,避免重复节点导致数据异常。
顶点插入流程
  • 检查顶点是否已存在于图中
  • 若不存在,则分配存储空间并初始化邻接表
  • 将顶点加入全局顶点集合
边的添加实现
func (g *Graph) AddEdge(src, dst string) {
    if !g.Contains(src) {
        g.AddVertex(src)
    }
    if !g.Contains(dst) {
        g.AddVertex(dst)
    }
    g.adjacencyList[src] = append(g.adjacencyList[src], dst)
}
上述代码展示了有向图中边的添加逻辑:先确保源和目标顶点存在,再将目标节点追加到源节点的邻接列表中。该操作时间复杂度为 O(1),适用于频繁增删的动态图场景。

3.2 删除边与顶点的处理策略

在图结构操作中,删除边与顶点需谨慎处理关联关系,避免出现悬空引用或数据不一致。
删除边的实现逻辑
对于邻接表表示的图,删除边可通过移除对应顶点邻接列表中的目标节点实现:
// 删除顶点u到v的有向边
func removeEdge(graph map[int][]int, u, v int) {
    for i, neighbor := range graph[u] {
        if neighbor == v {
            graph[u] = append(graph[u][:i], graph[u][i+1:]...)
            break
        }
    }
}
该函数通过切片操作移除指定边,时间复杂度为 O(n),适用于稀疏图场景。
顶点删除的连锁处理
删除顶点时,需同步清除所有指向该顶点的边。通常采用两步策略:
  1. 遍历图中所有顶点,删除与其相连的边;
  2. 从顶点集合中移除该顶点。
此策略确保图结构完整性,防止内存泄漏和访问异常。

3.3 实战:动态修改图结构的完整代码实现

在图计算系统中,动态修改图结构是支持实时数据更新的关键能力。本节通过一个完整的代码示例展示如何在运行时安全地增删节点与边。
核心操作接口设计
提供统一的API用于图结构变更,确保线程安全与数据一致性。

// AddVertex 动态添加顶点
func (g *Graph) AddVertex(id string, attrs map[string]interface{}) {
    g.Lock()
    defer g.Unlock()
    g.vertices[id] = attrs
}
上述方法通过互斥锁保护共享状态,防止并发写入导致数据竞争。
边的动态更新机制
支持运行时建立或删除节点之间的连接关系。

// AddEdge 添加有向边
func (g *Graph) AddEdge(src, dst string) {
    g.Lock()
    defer g.Unlock()
    if _, exists := g.edges[src]; !exists {
        g.edges[src] = make(map[string]bool)
    }
    g.edges[src][dst] = true
}
该实现使用嵌套映射存储邻接关系,时间复杂度为O(1)的边查找,适合高频更新场景。

第四章:图的遍历与典型算法应用

4.1 深度优先遍历(DFS)的矩阵实现

在图的邻接矩阵表示中,深度优先遍历通过递归或栈结构探索每个顶点的未访问邻居。矩阵的行对应当前顶点,列则表示可达性。
算法流程
  • 初始化访问标记数组 visited[],记录节点是否被访问
  • 从起始顶点开始,遍历其邻接行中的每一个元素
  • 若存在边且目标节点未被访问,则递归进入该节点
代码实现
void dfs(int matrix[][V], int start, int visited[]) {
    visited[start] = 1;
    printf("%d ", start);
    for (int i = 0; i < V; i++) {
        if (matrix[start][i] == 1 && !visited[i]) {
            dfs(matrix, i, visited);
        }
    }
}
上述函数以邻接矩阵 matrix、起始节点 start 和访问数组 visited 为参数。当 matrix[start][i] 为 1 时,表示存在边,且若 visited[i] 为假,则递归访问节点 i,确保所有连通节点被遍历。

4.2 广度优先遍历(BFS)的队列机制应用

广度优先遍历(BFS)利用队列的“先进先出”特性,逐层访问图或树的节点。从起始节点出发,将其入队,随后循环出队并访问其所有未访问邻接点,再依次入队,确保靠近起点的节点优先被处理。
队列在BFS中的核心作用
队列维持了节点的访问顺序,保证每一层节点在下一层之前被完全处理,是实现层级遍历的关键数据结构。

// BFS 遍历图的邻接表表示
func BFS(graph map[int][]int, start int) {
    visited := make(map[int]bool)
    queue := []int{start}
    visited[start] = true

    for len(queue) > 0 {
        node := queue[0]
        queue = queue[1:] // 出队
        fmt.Println(node)

        for _, neighbor := range graph[node] {
            if !visited[neighbor] {
                visited[neighbor] = true
                queue = append(queue, neighbor) // 入队
            }
        }
    }
}
上述代码中,queue 模拟队列操作,visited 防止重复访问。每次从队首取出节点,将其未访问的邻接点加入队尾,确保按层级扩展。

4.3 最短路径问题:Floyd算法原理与编码

算法核心思想
Floyd算法用于求解图中所有顶点对之间的最短路径,适用于带权有向图或无向图。其核心是动态规划思想:通过引入中间顶点逐步优化任意两点间的距离估计。
算法实现
def floyd_warshall(n, edges):
    # 初始化距离矩阵
    dist = [[float('inf')] * n for _ in range(n)]
    for i in range(n):
        dist[i][i] = 0
    for u, v, w in edges:
        dist[u][v] = w

    # 动态规划更新最短路径
    for k in range(n):
        for i in range(n):
            for j in range(n):
                if dist[i][k] + dist[k][j] < dist[i][j]:
                    dist[i][j] = dist[i][k] + dist[k][j]
    return dist
代码中,dist[i][j] 表示从顶点 i 到 j 的最短距离。三重循环枚举中间点 k,尝试通过 k 缩短路径。时间复杂度为 O(n³),适合中小规模稠密图。

4.4 最小生成树:Prim算法详解与实现

Prim算法用于在加权无向图中构造最小生成树(MST),其核心思想是从一个起始顶点出发,逐步扩展生成树,每次选择连接已选顶点集与未选顶点集中权值最小的边。
算法流程概述
  • 初始化:任选一个起始顶点加入生成树集合
  • 重复操作:选取连接已访问与未访问顶点的最小权重边
  • 更新顶点状态,直至所有顶点都被覆盖
Python实现示例
import heapq

def prim(graph, start):
    mst = []
    visited = set([start])
    edges = [(weight, start, to) for to, weight in graph[start]]
    heapq.heapify(edges)

    while edges:
        weight, frm, to = heapq.heappop(edges)
        if to not in visited:
            visited.add(to)
            mst.append((frm, to, weight))
            for neighbor, w in graph[to]:
                if neighbor not in visited:
                    heapq.heappush(edges, (w, to, neighbor))
    return mst
该实现使用优先队列维护候选边,确保每次取出最小权重边。graph以邻接表形式存储,时间复杂度为O(E log E),适用于稠密图场景。

第五章:性能分析与邻接矩阵的适用场景总结

邻接矩阵在稠密图中的优势
对于边数接近顶点数平方的稠密图,邻接矩阵表现出优异的查询效率。任意两点间是否存在边可通过 O(1) 时间判断,适合频繁查询的应用场景。
图类型空间复杂度边查询时间适用场景
稠密图O(V²)O(1)社交网络全连接分析
稀疏图O(V²)O(1)不推荐使用
实际内存开销对比
以 10,000 个顶点为例,布尔型邻接矩阵需占用约 100MB 内存(10⁴ × 10⁴ / 8 / 1024²),若使用 float64 存储权重则高达 800MB。这在嵌入式系统中可能不可接受。
  • 图像处理中像素邻域连接常采用邻接矩阵建模
  • 航班网络若包含所有城市对直飞信息,适合用矩阵存储
  • 实时路径规划系统中,预计算的邻接矩阵可加速最短路径查询
代码实现中的优化技巧
使用位压缩技术可减少空间占用,以下为 Go 语言示例:

// 使用 bitset 压缩存储布尔邻接矩阵
type BitMatrix struct {
    data []uint64
    size int
}

func (bm *BitMatrix) Set(i, j int) {
    idx := i*bm.size + j
    bm.data[idx/64] |= 1 << (idx % 64)
}

func (bm *BitMatrix) Get(i, j int) bool {
    idx := i*bm.size + j
    return (bm.data[idx/64] & (1 << (idx % 64))) != 0
}
[顶点A] —— 矩阵行 ——> [1 0 1 1] [顶点B] —— 矩阵行 ——> [0 1 0 1] 每一行代表从该顶点出发的所有连接状态
图的深度优先遍历非递归C语言实现(邻接矩阵、邻接表) 图的深度优先遍历非递归C语言实现(邻接矩阵、邻接表)基本思想算法步骤时间复杂度运行示例完整源码 图的深度优先遍历非递归C语言实现(邻接矩阵、邻接表) 路漫漫其修远兮,吾将上下而求索。 每次写东西都会有一些感受,然而有一个问题就是总是容易忘记并且禁不住外界的诱惑,也更加认为“娱乐至死”在现在来说是针对一个人的精神。好了,接下来说说这次的论文,刚开始选这个题目是因为自己觉得上课虽然听着还可以,但是下来之后没有去练过,所以感觉就是比较模糊的,就借此机会来试炼并加深自己对这一块的掌握。 真正开始是在要交的前一天,这 阅读详情

相关推荐

带权无向图的邻接矩阵表示法(C语言实现)

带权无向图的邻接矩阵表示法(C语言实现) 文章目录带权无向图的邻接矩阵表示法(C语言实现)一、邻接矩阵表示法二、本次程序实现的功能三、带权无向图的结构体定义四、创建无向图及邻接矩阵五、输出邻接矩阵六、输出顶点集合七、判断两顶点是否邻接八、全部代码九、测试 一、邻接矩阵表示法 ​ 定义:所谓邻接矩阵存储,是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。 ​ 对于带权图而言,若顶点Vi 和 Vj 之间有边相连,则邻接

Aiden_yan的博客 3万+

图的邻接矩阵存储—C语言

代码实现: //图的邻接矩阵存储结构—用两个数组来表示图,一个一维数组存储图中的顶点信息,一个二维数组(称为邻接数组)存储图中的边或弧的信息。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <iostream> #define MAX_VERTI...

qq_38236355的博客 2840

数据结构-图(存储结构-邻接矩阵与邻接表)-C语言

图是一种复杂的数据结构,顶点之间的逻辑关系错综复杂,因此图的存储结构也分多种,由于图是由顶点和边或弧这两部分组成,所以将这两部分合到一个结构中比较困难。所以我们使用两个结构去存储图这种结构。这里主要介绍两种基本的存储结构,即邻接矩阵与邻接表。 图的邻接矩阵(Adjacency Matrix) 存储方式是用两个数组来表示图。一个一维 数组存储图中顶点信息, 一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。 //*****图——邻接矩阵******* #include <stdio.h> #

qq_42220733的博客 5926

图的邻接矩阵存储,深度优先遍历(C语言)

内容: 采用邻接矩阵存储图,进行图的深度优先搜索并输出结果。 1.算法分析: 整个程序分为两部分,第一部分为邻接矩阵存储图,第二部分为图的优先搜索。将两个部分的算法做一个简单的分析即可。 第一部分,邻接矩阵存储图,因为顶点和顶点之间的关系直接合在一起存储比较困难,所以我们可以使用一维数组来存储顶点信息,用二维数组来存储边的信息。假设图G=(V,E)有n个确定的顶点,即V={V0,V1,…,V(n-1)},则表示G中各顶点相邻关系为一个n*n的矩阵,矩阵...

qbyyds的博客 1万+

C语言利用图的邻接矩阵的存储方式实现拓扑排序

 C语言利用图的邻接矩阵的存储方式实现拓扑排序 在拓扑排序中,我们的对象是有向无环图,这种图是描述工程进行过程的有效工具。比如“课程开课顺序,施工进程,软件开发进程”,我们在使用有向无环图表示他们的时候,我们往往使用顶点表示这些事件中的一个活动,顶点和顶点之间的有向边表示一种活动和活动之间的先后顺序。 如上就是一种有向无环图,比如在活动c1进行完成之后,c8、c3才可以开始进行。通常,我们...

Xenoverse的博客 4036

C语言 数据结构 图的邻接矩阵存储 基本操作(附输入样例和讲解)

代码参照了严蔚敏、吴伟民编写的数据结构(C语言版)。 部分内容参考了这位大佬: https://blog.youkuaiyun.com/jeffleo/article/details/53326648 所有代码采用C语言编写。讲解请查看注释。 头文件及宏定义 #include<stdio.h> #include<stdlib.h> #include<string.h> #define INFINITY 0//最大值0,即两个顶点之间没有弧时的权值 #define MAX_VER

qq_31744851的博客 3770

图的表示与基础操作:邻接矩阵与邻接表的C语言实现

图由顶点集和边集构成,边可以是有向或无向的,且可带有权重。根据图的特性选择合适的存储结构至关重要,这直接影响到图的各种操作(如遍历、查找最短路径等)的效率。本文只对于代码做简单分享,不对代码的逻辑做深层解释,如果读者想知道代码的实现逻辑,请详细阅读代码中的注释部分。

Mrluo386的博客 2547

功能安全入门:手把手教你用IEC 62380标准计算芯片失效率(附SN 29500对比)

本文深入解析了IEC 62380标准在芯片失效率计算中的应用,对比了SN 29500的差异,并提供了实战案例和避坑指南。通过详细的参数获取方法和分步计算演示,帮助功能安全工程师准确评估芯片可靠性,确保设计符合安全要求。特别适合汽车电子和工业控制领域的专业人士参考。

weixin_30363981的博客 316

C语言 数据结构 图的邻接矩阵存储及基本操作

图的基本操作 图的存储结构有邻接矩阵与邻接表 这里采用邻接矩阵存储 图有有向图、无向图,还有带权值和不带权值的 代码都差不多,就几个地方改一下就就行 本文以带权有向图为例 其他修改也有注明

C语言/数据结构/数学建模/深度学习/生物信息 4546

Android dex, odex, oat, vdex, art文件介绍

下图可以简化将Java源转换为OAT的过程: .dex Dalvik虚拟机字节码文件 .vdex 其中包含APK的未压缩DEX代码,以及一些旨在加快验证速度的元数据 .odex .oat // JIT,Just-in-time,即时编译,边运行边编译; // AOT,Ahead Of Time,提前编译,指运行前编译。 其中包含APK中已经过AOT编译的方法代码。 原始DEX文件(例如classes.dex)被转换为另一个包含本机代码的文件。这个新文件通常具有.odex。.oat扩展名,并由ELF格式

he980725866的博客 3620

mpu6050原理图_STM32控制 MPU6050 六轴陀螺仪资料汇总

一般使用MPU6050的步骤是先驱动I2C总线,然后初始化MPU6050,从MPU6050读取数据,最后是数据的处理。本文档详细介绍有关MPU6050 三维角度传感器电子陀螺仪使用说明。附件内容提供该 MPU6050模块原理图,配套STM32代码,相关数据手册及参考文档。实物连接图:MPU6050 六轴陀螺仪特点:使用芯片:MPU-6050供电电源:3-5v(内部低压差稳压)通信方式:标...

weixin_39911056的博客 4758

图——邻接矩阵的存储与基本操作

1.邻接表存储 用两个数组分别存储:数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。 其形式描述如下: // ----- 图的数组(邻接矩阵)存储表示 ----- // // 常量定义 # define INFINITY -1 // 最大权重,表示不邻接关系 # define MAX_VERTEX_NUM 10 // 最大顶点个数 typedef int...

75 69 69 80 32 67 79 68 73 78 71 33 7199

基于STM32设计的物联网疫苗冷链物流监测系统

本设计基于物联网技术,开发了一套疫苗冷链物流环境监测系统。系统采用STM32F103C8T6作为主控芯片,集成SHT30温湿度传感器、震动传感器、GPS定位模块和4G通信模块,实现对运输环境的温度、湿度及震动状况的实时监测与控制。通过继电器驱动半导体制冷模块和加湿器,系统能够自动调节环境温湿度,保障疫苗运输的安全性。采集的环境数据通过MQTT协议上传至华为云物联网平台,配套开发的Android手机APP和Windows上位机软件基于Qt平台设计,支持远程实时查看环境数据和车辆定位,提升了疫苗冷链运输的智能化

863

图的邻接矩阵实现C语言

实现如图邻接矩阵: 编译环境:vc6.0,代码如下 /* 顶点数据类型为char,边上权值类型为int */ #include <stdio.h> #include <stdlib.h> #define MAXVEX 100 //最大顶点数 #define INFINITY 99999 //用99999表示无限大 //*****************...

学习笔记,仅供参考 3195

提示词驱动的多智能体协作系统

《提示词驱动的多智能体协作系统》 关键词:人工智能、多智能体系统、协作机制、提示词驱动、系统设计与应用 摘要:本文深入探讨提示词驱动的多智能体协作系统,首先介绍其背景和核心概念,然后详细分析多智能体系统的基本原理和提示词驱动的协作机制,最

AI天才研究院 849

学Simulink——基于Simulink的固态变压器(SST)多级协同控制​

本文介绍了基于Simulink的固态变压器(SST)多级协同控制系统设计与仿真方法。SST作为智能电网关键设备,包含AC-DC整流、DC-DC隔离和DC-AC逆变三级变换器。针对级间耦合问题,提出了能量-功率协同控制策略,通过纵向解耦和横向联动实现稳定运行。详细演示了在Simulink中搭建三级主电路、设计协同控制器(含电网定向控制、功率前馈和虚拟惯性控制)的全过程,并通过负载突变测试验证了系统动态性能(直流母线电压波动<2%)。最后给出了工程部署建议,包括数字控制延时补偿、启动序列设计和代码自动生成

xiaoheshang_123的博客 206

C语言图的邻接矩阵建立算法

目录 1.邻接矩阵(adjacency matrix) 2.无向图的邻接矩阵表示 3.有向图的邻接矩阵表示 4.网的邻接矩阵表示 5.示例源代码 1.邻接矩阵(adjacency matrix) (1)用一维数组存储顶点信息 (2)用矩阵(二维数组)表示图中顶点邻接关系 2.无向图的邻接矩阵表示 规定:若两节点连通,则在矩阵对应位置元素置1,否则置0 3.有向图的邻接矩阵...

记录学习点滴 1万+

Manus创始人深度复盘:AI Agent产品的技术架构与战略转型

成本对比:同样任务处理,中国区单位成本是亚太区的2.3倍。付费转化率:中国区1.2% vs 全球平均4.7%微信/支付宝等超级App的适配代码占比达17%Zstandard:压缩比38%,耗时12ms。每季度需要投入3名高级工程师专职维护兼容性。国际版API平均延迟:180-220ms。中国版特殊部署延迟:480-720ms。信息保持准确率:93%(7天跨度测试)自研算法:压缩比39%,耗时5ms。存储效率:相比纯文本节省68%空间。:本地化部署导致的延迟与费用差异。LZ4:压缩比42%,耗时8ms。

m0_75253143的博客 7146

图之邻接矩阵详解(C语言版)

图之邻接矩阵详解(C语言版)

qq_44075108的博客 1万+

SAP Fiori 从技术上而言到底包含哪些组件?

SAP Fiori是企业级UX设计的系统化解决方案,基于五大原则构建:角色导向(Role-based)、自适应(Adaptive)、简洁(Simple)、一致(Coherent)和愉悦(Delightful)。其技术实现包含SAPUI5开发框架、Fiori Launchpad统一入口、OData服务网关等核心组件,通过标准化设计模式与开发工具链,显著提升企业应用的用户体验和开发效率。典型案例显示,遵循Fiori原则可缩短30%以上的操作时长,降低50%的培训成本。该体系既保持跨设备一致性,又支持业务场景的深

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 223

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据结构-图的创建(邻接矩阵,邻接表)C语言实现

图的定义: 图(Graph)G由两个集合V和E组成,记为:G=(V,E),其中V是顶点的有穷非空集合(其实就是顶点),E是V中顶点偶对的有穷集合(就是边)。V(G)和E(G)通常分别表示图G的顶点集合以及边集合,E(G)可以为空集合,但是此时的图只有顶点,没有边。 分类: 有向图:在有向图中,顶点对<V,W>是有序的,表示它从V到W的一条有向边。所以,<W,V>表示的和<V,W>不同的边,顶点的指向不同。有向图中顶点对用尖括号表示<>,<x,y>

qq_45820763的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历

在Dev C++中调试运行通过。 用下图进行了测试。 #include #define MaxVertexNum 50 #define QueueSize 50 typedef enum{FALSE,TRUE}shifou; shifou visited[MaxVertexNum];

KittyGirl 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

如何用java实现图的存储【邻接矩阵】

如何用java实现图的存储【邻接矩阵】首先得考虑图的几条重要特性如何表示顶点如何表示边表示图中的边有两种方法,邻接矩阵和邻接表。如何构造邻接矩阵如何把图打印出来看看结果附上代码完结撒花 首先得考虑图的几条重要特性 怎么样可以确定一个图呢,我们先举个例子: 如图所示,该图中有5个顶点,“A” “B” “C” “D” “E”。 而且A-B,A-D,B-D,B-C,D-E之间有一条边,事实上边上还可以有...

weixin_46007276的博客 3469

C语言-图的存储结构(邻接矩阵)

查找函数(LocateVex查找坐标) 构建有向图(Directed Graph) 构建无向图(Undirected Graph) 构建有向网(Directed Network) 构建无向网(Undirected Network) 图的类型选择函数(GraphChoice) 输出邻接矩阵(print) 完整源代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #define VertexMax .

Attract's Blog 1万+

实现图的邻接矩阵和邻接表的存储

编写一个程序graph.cpp,设计带权图的邻接矩阵和邻接表的创建和输出运算(包括邻接矩阵和邻接表之间的转换)  //图的基本运算算法 #include #include //图的两种存储结构 #define INF 32767    //定义∞ #define MAXV 100    //最大顶点个数 typedef char InfoType; //以下定义邻接矩阵类

追溯的博客 1万+

图的五种存储结构及其C语言实现

文章目录???? 一、图的基本概念????二、图的基本存储结构????1.邻接矩阵法????1.1 存储结构????1.2 创建邻接矩阵????1.3 打印邻接矩阵存储的图????1.4 测试函数????2.邻接表法????2.1 存储结构????2.2 创建邻接表????2.3 打印邻接表法存储的图????2.4 测试函数????️3.十字链表法????️3.1 存储结构????3.2 创建十字链表????3.3 打印十字链表存储的图????3.4 测试函数????4.邻接多重表法????4.1 存储结构

CS_boy的博客 5255
上一篇: 揭秘C调用NumPy数组全过程:3步实现高性能数据交换
下一篇: C语言register优化实战(3大案例揭示编译器真实行为)
IterStream
博客等级 码龄1年 152粉丝 2112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值