图论基础

分类: 图论 · 更新时间 2026-5-27 21:42:14

图论基础

图(Graph)由 顶点(Vertex)边(Edge) 组成。

基本概念

概念 说明
顶点 图中的节点,通常编号为 1n1 \sim n
连接两个顶点的连线,可能带有方向或权值
有向图 边有方向,uvu \to v 不同于 vuv \to u
无向图 边无方向,(u,v)(u, v)(v,u)(v, u) 是同一条边
顶点的度 = 与该点相连的边数。有向图分为入度和出度
环(自环) 起点 = 终点的边
重边 两点之间存在多条边
简单图 无自环、无重边的图
稀疏图 / 稠密图 mnm \approx n 为稀疏,mn2m \approx n^2 为稠密
路径 首尾相连的边的序列
简单路径 路径中每个顶点只出现一次
连通图 任意两点之间存在路径
无环连通图,nn 个点 n1n-1 条边

邻接矩阵

g[u][v]g[u][v] 表示 uuvv 的边权(无边则为 00\infty)。

int g[1005][1005]; // 空间 O(n^2),适合 n <= 5000 的稠密图

void add_edge(int u, int v, int w)
{
    g[u][v] = w;
    // 无向图:g[v][u] = w;
}

邻接表(vector)

struct Edge
{
    int to, w;
};
vector<Edge> g[MAXN]; // 空间 O(m)

void add_edge(int u, int v, int w)
{
    g[u].push_back({v, w});
    // 无向图:g[v].push_back({u, w});
}

链式前向星

int head[MAXN], to[MAXM * 2], w[MAXM * 2], nxt[MAXM * 2], cnt;

void add_edge(int u, int v, int weight)
{
    cnt++;
    to[cnt] = v;
    w[cnt] = weight;
    nxt[cnt] = head[u];
    head[u] = cnt;
}

// 遍历 u 的所有邻居
for (int i = head[u]; i; i = nxt[i])
    int v = to[i], weight = w[i];