邻接矩阵和邻接表笔记
邻接矩阵
#include <iostream>
using namespace std;
//定义边
typedef struct Enode *PtrlEnode;
struct Enode {
int V1, V2; //有向边<V1,V2>
int weight;//权重
};
typedef PtrlEnode Edge;
//图节点定义
typedef struct Gnode *PtrlGnode;
struct Gnode {
int nv;//顶点数
int ne;//边数
int G[100][100];//最大顶点数设为100;邻接矩阵
};
typedef PtrlGnode MGraph;//以邻接矩阵存储的图类型
MGraph CreateGraph(int VertexNum) {
//初始化有VertexNum个顶点且无边的图
int V, M;
MGraph Graph = new Gnode;
Graph->nv = VertexNum;
Graph->ne = 0;
for(int i=0;i<100;i++)
{
for(int j=0;j<100;j++)
Graph->G[i][j]=9999;
}
return Graph;
}
void InsertEdge(MGraph Graph, Edge E) {
Graph->G[E->V1][E->V2] = E->weight; //插入<V1,V2>
Graph->G[E->V2][E->V1] = E->weight; //无向图还要反向插
}
MGraph BuildGraph() {
MGraph Graph;
Edge E;
int V;
int nv, i;
cin >> nv;//顶点个数
Graph = CreateGraph(nv); //初始化nv个顶点且无边的图
cin >> Graph->ne;//读入边数
if (Graph->ne != 0) {
E = new Enode;
for (i = 0; i < Graph->ne; i++) {
cin >> E->V1 >> E->V2 >> E->weight;
InsertEdge(Graph, E);
}
}
return Graph;
}
int main() {
MGraph Graph = BuildGraph();
for (int i = 0; i < Graph->nv; i++) {
for (int j = 0; j < Graph->nv; j++)
cout << Graph->G[i][j] << " ";
cout << endl;
}
return 0;
}
邻接表
#include <iostream>
using namespace std;
//定义边
typedef struct Enode *PtrlEnode;
struct Enode {
int V1, V2; //有向边<V1,V2>
int weight;//权重
};
typedef PtrlEnode Edge;
//邻接点定义
typedef struct Adjvnode *PtrlAdjvnode;
struct Adjvnode {
int Adjv;//邻接点下标
int weight;//边权重
PtrlAdjvnode next;
};
//顶点表头结点的定义
typedef struct Vnode {
PtrlAdjvnode FirstEdge;//边表头的指针
} AdjvList[100]; //邻接表类型
//图节点定义
typedef struct Gnode *PtrlGnode;
struct Gnode {
int nv;//顶点数
int ne;//边数
AdjvList G;//邻接表
};
typedef PtrlGnode LGraph;
LGraph CreatGraph(int Vertexnum) {
//初始化一个有Vertexnum个顶点且没有边的图
int V;
LGraph Graph;
Graph = new Gnode;
Graph->nv = Vertexnum;
Graph->ne = 0;
//初始化邻接表头指针
for (V = 0; V < Graph->nv; V++)
Graph->G[V].FirstEdge = NULL;
return Graph;
}
void InsertEdge(LGraph Graph, Edge E) {
PtrlAdjvnode newnode;
//插入边<V1,V2>
//为V2建立新的邻接点
newnode = new Adjvnode;
newnode->Adjv = E->V2;
newnode->weight = E->weight;
//将V2插入V1的表头
newnode->next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = newnode;
//如果是无向图,就还要反向再插一次
//为V1建立新的邻接点
newnode = new Adjvnode;
newnode->Adjv = E->V1;
newnode->weight = E->weight;
//将V1插入V2表头
newnode->next = Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge = newnode;
}
LGraph BuildGraph() {
LGraph Graph;
Edge E;
int V;
int nv, i;
cin >> nv;//顶点个数
Graph = CreatGraph(nv); //初始化nv个顶点且无边的图
cin >> Graph->ne;//读入边数
if (Graph->ne != 0) {
E = new Enode;
for (i = 0; i < Graph->ne; i++) {
cin >> E->V1 >> E->V2 >> E->weight;
InsertEdge(Graph, E);
}
}
return Graph;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)