没有合适的资源?快使用搜索试试~ 我知道了~
内容包含图的相关算法的关键代码,包含但不限于图的存储结构(邻接矩阵和邻接表)、DFS 和 BFS(含递归和非递归两种形式)、拓扑排序、最小代价生成树(Prim 和 Kruskal 算法)、最短路径(Dijkstra 和 Floyd 算法)等等。 在内容的最后,还附加有习题(含真题)以及解析。 适合考暨南大学 848 和 830 考研中(图的相关应用算法是考试的重点), 或是其他需要考或学习图的应用算法的人群。 PDF 源于下方链接:(如若有问题可以问博主,若博主在线便会回答) https://blog.csdn.net/qq_34438969/article/details/127176373
资源推荐
资源详情
资源评论
CSDN 博主:住在阳光的心里
图的相关应用算法
一、图的存储结构
(一)邻接矩阵
#define MaxVertexNum 100 //顶点数目的最大值
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
typedef struct{
VertexType Vex[MaxVertexNum]; //顶点表
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表;
int vexnum, arcnum; //图的当前顶点数和弧数
}MGraph;
(二)邻接表
#define MaxVertexNum 100 //图中顶点数目的最大值
typedef struct ArcNode{ //边表结点
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
InfoType info; //网的边权值
}ArcNode;
typedef struct VNode{ //顶点表结点
VertexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode, AdjList[MaxVertexNum];
typedef struct{
AdjList vertices; //邻接表
int vexnum, arcnum; 图的顶点数和弧数
}AGraph;
二、图的遍历方式
(一)DFS
bool visited[MaxVertexNum]; //标记访问数组
void DFSTraverse(Graph G){ //对图 G 进行深度优先遍历
for(v = 0; v < G.vexnum; ++v){ // v 为起始顶点
visited[v] = FALSE; //初始化已访问标记数据
}
for(v = 0; v < G.vexnum; ++v){
if(!visited[v])
DFS(G, v);
}
}
CSDN 博主:住在阳光的心里
void DFS(Graph G, int v){ //从顶点 v 出发,深度优先遍历图 G
visit(v); //访问顶点 v
visited[v] = TRUE; //设已访问标记
for(w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w)){
if(!visited[w]) // w 为 v 的尚未访问的邻接顶点
DFS(G, w);
}
}
/*FirstNeighbor(G, v):求图 G 中顶点 v 的第一个邻接点,若有则返回顶点号。若 v 没有邻接点或
图中不存在 v,则返回-1。
NextNeighbor(G, v, w):假设图 G 中顶点 w 是顶点 v 的一个邻接点,返回除 w 外顶点 v 的下一个
邻接点的顶点号,若 w 是 v 的最后一个邻接点,则返回-1。
*/
1、图 G 采用邻接表方式,递归
int visit[MaxSize]; //访问标记数组
void DFS(AGraph *G, int v){
ArcNode *p;
visit[v] = 1;
cout << v << endl;
p = G->AdjList[v].firstarc; //让 p 指向顶点 v 的第一条边
while(p != NULL){
if(visit[p->adjvex] == 0){
DFS(G, p->adjvex);
}
p = p->nextarc;
}
}
2、图 G 采用邻接表方式,非递归
/* DFS:非递归,邻接表。使用栈 S 来记忆下一步可能访问的顶点,同时使用了一个访问标记数
组 visited[i] 来记忆第 i 个顶点是否在栈内或曾经在栈内,若是则它以后不能再进栈;*/
void DFS_Non_RC(AGraph& G, int v){
int w; //顶点序号
InitStack(S); //初始化栈 S
for(i = 0; i < G.vexnum; i++){
visited[i] = FALSE; //初始化 visited
}
// v 入栈,并置 visited[v]
Push(S, v);
visited[v] = TRUE;
CSDN 博主:住在阳光的心里
while(!IsEmpty(S)){
k = Pop(S); //栈中退出一个顶点
visit(k); //先访问,再将其子结点入栈
for(w = FirstNeighbor(G, k); w >= 0; w = NextNeighor(G, k, w)){ // k 所有邻接点
if(!visited[w]){ //未进过栈的顶点进栈
Push(S, w);
Visited[w] = TRUE; //作标记,以免再次入栈
}
}
}
}
【完整运行代码】
#pragma warning(once:4996)
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<stack>
#define OK 1
#define MaxVertexNum 100 //图中顶点数目的最大值
int visited[MaxVertexNum]; //访问标志数组,其初值为 0
//邻接表
typedef struct ArcNode { //边表结点
int adjvex; //该弧所指向的顶点的位置
struct ArcNode* nextarc; //指向下一条弧的指针
int info; //网的边权值
}ArcNode;
typedef struct VNode { //顶点表结点
int data; //顶点信息
ArcNode* firstarc; //指向第一条依附该顶点的弧的指针
}VNode, AdjList[MaxVertexNum];
typedef struct {
AdjList vertices; //邻接表
int vexnum, arcnum; //图的顶点数和弧数
}AGraph;
//确定 v 在 G 中的位置,即顶点在 G.vertices 中的序号
int LocateVex(AGraph G, int v) {
for (int i = 0; i < G.vexnum; i++) {
if (v == G.vertices[i].data)
return i;
}
CSDN 博主:住在阳光的心里
}
//邻接表法创建无向图
int CreateUDG(AGraph& G) {
int i, j, k, v1, v2;
ArcNode* p1, * p2;
printf("请输入总顶点数和总边数: ");
scanf_s("%d", &G.vexnum); //输入总顶点数
scanf_s("%d", &G.arcnum); //输入总边数
printf("\n");
printf("请输入顶点信息: ");
for (i = 0; i < G.vexnum; ++i) { //输入各点,构造表头节点表
scanf_s("%d", &G.vertices[i].data); //输入顶点值
G.vertices[i].firstarc = NULL; //初始化表头节点的指针域为 NULL
}
printf("\n");
printf("请输入每一条边对应的两个顶点: \n");
for (k = 0; k < G.arcnum; ++k) { //输入各边,构造邻接表
scanf_s("%d%d", &v1, &v2); //输入一条边依附的两个顶点
i = LocateVex(G, v1);
j = LocateVex(G, v2);
p1 = new ArcNode; //生成一个新的边节点*p1
p1->adjvex = j; //邻接点序号为 j
p1->nextarc = G.vertices[i].firstarc; //将新节点*p1 插入顶点 vi 的边表头
G.vertices[i].firstarc = p1;
p2 = new ArcNode; //生成一个新的边节点*p2
p2->adjvex = i; //邻接点序号为 i
p2->nextarc = G.vertices[j].firstarc; //将新节点*p2 插入顶点 vj 的边表头
G.vertices[j].firstarc = p2;
}
return OK;
}
//打印邻接表存储数据
void print_position(AGraph G) {
for (int i = 0; i < G.vexnum; i++) {
ArcNode p;
p.adjvex = G.vertices[i].firstarc->adjvex;
p.nextarc = G.vertices[i].firstarc->nextarc;
printf("%d -> ", G.vertices[i].data);
while (p.nextarc != NULL) {
printf("%d -> ", G.vertices[p.adjvex].data);
剩余15页未读,继续阅读
资源评论
住在阳光的心里
- 粉丝: 6063
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功