数据结构实验八 图及其应用

实验内容

1.编写一个程序,完成如下功能:

(1) 建立如下有向图G1的邻接矩阵输出,并由邻接矩阵产生邻接表输出之;
(2) 输出图G1从顶点0开始的深度优先遍历序列;
(3) 输出图G1从顶点0开始的广度优先遍历序列;
(4) 用普里姆算法输出从顶点0出发的最小生成树;

参考自:https://blog.csdn.net/chj65/article/details/103935951

#include <stdio.h>
#include <iostream>
using namespace std;typedef int InfoType;
#define MAXV 100                //最大顶点个数
#define INF 32767               //INF表示∞
//以下定义邻接矩阵类型
typedef struct
{int no;                        //顶点编号InfoType info;                //顶点其他信息
} VertexType;                   //顶点类型
typedef struct                  //图的定义
{int edges[MAXV][MAXV];         //邻接矩阵int n, e;                     //顶点数,边数VertexType vexs[MAXV];       //存放顶点信息
} MGraph;                       //图的邻接矩阵类型
//以下定义邻接表类型
typedef struct ANode            //边的节点结构类型
{int adjvex;                //该边的终点位置struct ANode* nextarc;         //指向下一条边的指针InfoType info;               //该边的相关信息,这里用于存放权值
} ArcNode;
typedef int Vertex;
typedef struct Vnode            //邻接表头节点的类型
{Vertex data;               //顶点信息ArcNode* firstarc;            //指向第一条边
} VNode;
typedef VNode AdjList[MAXV];    //AdjList是邻接表类型
typedef struct
{AdjList adjlist;           //邻接表int n, e;                  //图中顶点数n和边数e
} ALGraph;                      //图的邻接表类型void MatToList1(MGraph g, ALGraph *&G)
//将邻接矩阵g转换成邻接表G
{int i, j;ArcNode* p; //表结点结构类型G = new ALGraph;for (i = 0; i < g.n; i++)                 //给邻接表中所有头节点的指针域置初值G->adjlist[i].firstarc = NULL;for (i = 0; i < g.n; i++)                    //检查邻接矩阵中每个元素for (j = g.n - 1; j >= 0; j--)if (g.edges[i][j] != 0 && g.edges[i][j] != INF)   //存在一条边{p = new ArcNode;p->adjvex = j;     //终点信息 p->info = g.edges[i][j];   //权值信息 p->nextarc = G->adjlist[i].firstarc;        //将*p链到链表后G->adjlist[i].firstarc = p;}G->n = g.n; G->e = g.e;
}void DispMat1(MGraph g)
//输出邻接矩阵g
{int i, j;for (i = 0; i < g.n; i++){for (j = 0; j < g.n; j++)if (g.edges[i][j] == INF)printf("%3s", "∞");elseprintf("%3d", g.edges[i][j]);cout << endl;}
}
void DispAdj1(ALGraph* G)
//输出邻接表G
{int i;ArcNode* p;for (i = 0; i < G->n; i++){p = G->adjlist[i].firstarc;printf("%3d: ", i);while (p != NULL){printf("%3d(%d)", p->adjvex, p->info);p = p->nextarc;}cout << endl;}
}int visited[MAXV] = { 0 };  //全局数组void DFS(ALGraph* G, int v)   //深度优先递归算法
{ArcNode* p;visited[v] = 1;                    //置已访问标记printf("%3d", v);                     //输出被访问顶点的编号p = G->adjlist[v].firstarc;             //p指向顶点v的第一条弧的弧头结点while (p != NULL){if (visited[p->adjvex] == 0)      //若p->adjvex顶点未访问,递归访问它DFS(G, p->adjvex);p = p->nextarc;                      //p指向顶点v的下一条弧的弧头结点}
}void BFS(ALGraph* G, int v)  //广度优先遍历
{ArcNode* p;int queue[MAXV], front = 0, rear = 0;         //定义循环队列并初始化int visited[MAXV];                      //定义存放结点的访问标志的数组int w, i;for (i = 0; i < G->n; i++) visited[i] = 0;       //访问标志数组初始化printf("%3d", v);                      //输出被访问顶点的编号visited[v] = 1;                            //置已访问标记rear = (rear + 1) % MAXV;queue[rear] = v;                            //v进队while (front != rear)                     //若队列不空时循环{front = (front + 1) % MAXV;w = queue[front];                      //出队并赋给wp = G->adjlist[w].firstarc;             //找与顶点w邻接的第一个顶点while (p != NULL){if (visited[p->adjvex] == 0)         //若当前邻接顶点未被访问{printf("%3d", p->adjvex);    //访问相邻顶点visited[p->adjvex] = 1;     //置该顶点已被访问的标志rear = (rear + 1) % MAXV;            //该顶点进队queue[rear] = p->adjvex;}p = p->nextarc;                     //找下一个邻接顶点}}cout << endl;
}
void Prim(MGraph g, int v)    //prim 算法求最小生成树
{int lowcost[MAXV], min, n = g.n;int closest[MAXV], i, j, k;for (i = 0; i < g.n; i++)//赋初值,即将closest数组都赋为第一个结点v,lowcost数组赋为第一个结点v到各结点的权重{closest[i] = v;lowcost[i] = g.edges[v][i];//g.edges[v][i]的值指的是结点v到i节点的权重}for (i = 1; i < g.n; i++)//接下来找剩下的n-1个结点(g.n是图的节点个数){min = INF;//INF表示正无穷(每查找一个结点,min都会重新更新为INF,以便获取当前最小权重的结点)for (j = 0; j < g.n; j++)//遍历所有结点{if (lowcost[j] != 0 && lowcost[j] < min)//若该结点还未被选且权值小于之前遍历所得到的最小值{min = lowcost[j];//更新min的值k = j;//记录当前最小权重的结点的编号}}printf("边(%d,%d)权为:%d\n", closest[k], k, min);lowcost[k] = 0;//表明k结点已被选了(作标记)//选中一个结点完成连接之后,作数组相应的调整for (j = 0; j < g.n; j++)//遍历所有结点{if (g.edges[k][j] != 0 && g.edges[k][j] < lowcost[j]){//更新lowcost数组,closest数组lowcost[j] = g.edges[k][j];//更新权重,使其当前最小closest[j] = k;//进入到该if语句里,说明刚选的结点k与当前结点j有更小的权重,则closest[j]的被连接结点需作修改为k}}}}int main()
{ALGraph* G;MGraph g;int path[MAXV], i, j, v = 0;g.n = 6; g.e = 10;int A[MAXV][6] = {{ 0, 5, INF, 7, INF, INF },{ INF, 0, 4, INF, INF, INF },{ 8, INF, 0, INF, INF, 9 },{ INF, INF, 5, 0, INF, 6 },{ INF, INF, INF, 5, 0, INF },{ 3, INF, INF, INF, 1, 0 } };for (i = 0; i < g.n; i++)for (j = 0; j < g.n; j++)g.edges[i][j] = A[i][j];cout << "有向图G的邻接矩阵:" << endl;DispMat1(g);G = new ALGraph;MatToList1(g, G);cout << "图G的邻接表:" << endl;DispAdj1(G);   //输出邻接表cout << "从顶点0开始的DFS(递归算法):" << endl;DFS(G, 0); cout << endl;cout << "从顶点0开始的BFS(非递归算法):" << endl;BFS(G, 0); cout << endl;cout << "普里姆算法求解结果:" << endl;Prim(g, 0);return 0;
}

2.基于Dijkstra算法的最短路径求解:

问题描述:

一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知。给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间的最短路径。

输入要求:

多组数据,每组数据有m+3行。第一行为两个整数n和m,分别代表城市个数n和路径条数m。第二行有n个字符,代表每个城市的名字。第三行到第m+2行每行有两个字符a和b和一个整数d,代表从城市a到城市b有一条距离为d的路径。最后一行为两个字符,代表待求最短路径的城市起点和终点。当n和m都等于0时,输入结束。

输出要求:

每组数据输出两行。第一行为一个整数,为从起点到终点之间最短路径的长度。第二行为一串字符串,代表该路径。每两个字符之间用空格隔开。

输入样例

3 3
A B C
A B 1
B C 1
C A 3
A C
6 8
A B C D E F
A F 100
A E 30
A C 10
B C 5
C D 50
D E 20
E F 60
D F 10
A F
0 0

输出样例

2
A B C
60
A E D F
#include<iostream>
using namespace std;
#define maxn 200
#define inf 1e9int n;
char v[maxn];
int Hash[maxn];
int e[maxn][maxn];
int dis[maxn];
int path[maxn];
int visit[maxn];void Dijkstra(int x)
{int k, min;for (int i = 1; i <= n; i++){dis[i] = e[x][i];visit[i] = 0;if (e[x][i] < inf)path[i] = x;elsepath[i] = -1;}dis[x] = 0;visit[x] = 1;for (int t = 0; t < n - 1; t++){min = inf;for (int i = 1; i <= n; i++){if (!visit[i] && dis[i] < min){k = i;min = dis[i];}}visit[k] = 1;for (int i = 1; i <= n; i++){if (!visit[i] && dis[i] > dis[k] + e[k][i]){dis[i] = dis[k] + e[k][i];path[i] = k;}}}
}
void printpath(int x)
{if (x != -1){printpath(path[x]);cout << v[x] << " ";}
}
int main()
{int m, d;char x, y;while (1){cin >> n >> m;if (!n && !m)break;for (int i = 0; i < maxn; i++)for (int j = 0; j < maxn; j++)e[i][j] = inf;for (int i = 1; i <= n; i++){cin >> v[i];Hash[v[i]] = i;}while (m--){cin >> x >> y >> d;e[Hash[x]][Hash[y]] = e[Hash[y]][Hash[x]] = d;}cin >> x >> y;Dijkstra(Hash[x]);cout << dis[Hash[y]] << endl;printpath(path[Hash[y]]);cout << v[Hash[y]] << endl;}return 0;
}

数据结构实验八 图及其应用相关推荐

  1. 数据结构实验六 图的操作实现

    数据结构实验六 图的操作实现 一.实验目的 1. 理解图的存储结构与基本操作: 2. 掌握图的创建过程 二.实验内容 1.根据下图,采用邻接矩阵的存储结构保存此图,并打印出邻接矩阵. 图的创建代码参考 ...

  2. 数据结构实验三 图的操作与实现

    系列文章: 数据结构实验一 线性表.堆栈和队列的操作与实现 数据结构实验二 二叉树的操作与实现 数据结构实验三 图的操作与实现 数据结构实验四 查找和排序算法实现 一.实验目的: 1.领会图的两种主要 ...

  3. 数据结构实验:图遍历的演示

    数据结构实验四:图遍历的演示 实验题目描述 1.基本要求 2.参考 实验过程 1.开发环境描述 2.题目分析及解题思路 3.实验代码 4.文件 联系我 实验题目描述 1.基本要求 ① 很多涉及图上操作 ...

  4. 图的遍历c语言数据结构实验报告,数据结构实验报告--图的遍历

    江 西 理 工 大 学 数据结构 实验报告 实验名称 图的遍历 日期 2014-12-01 专业班级 计算机(中加)131班 地点 信息学院621 实验人 王鹏伟 学号 同组人 单独完成 152013 ...

  5. 数据结构实验六 图的综合应用

    实验六  图的综合应用 一.实验目的 1.掌握图的基本操作-遍历: 2. 掌握图的应用. 二.实验内容 对给定的输入内容,完成实验任务 输入顶点集:1 2 3 4 5 6 7 8 输入边的集合: 1  ...

  6. 数据结构实验6图的应用-行车路线问题

    需求分析 0.问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增 ...

  7. 数据结构 实验六 图基本操作的编程实现

    [实验目的] 图基本操作的编程实现 要求: 图基本操作的编程实现(2学时,验证型),掌握图的建立.遍历.插入.删除等基本操作的编程实现,存储结构可以在顺序结构.链接结构.联合使用多种结构等中任选,也可 ...

  8. 石家庄铁道大学数据结构实验4 图(完整代码)

    这个实验应该是最麻烦的一个了 就很烦 写了500多行 洒洒水啦 #include<algorithm> #include <iostream> #include<cmat ...

  9. 南邮数据结构实验三---图的基本运算及飞机换乘次数最少问题

    一. 实验目的和要求 1.掌握在图的邻接矩阵和邻接表存储结构实现图的基本运算的算法.学习使用图算法解决应用问题的方法. (1). 验证教材中关于在邻接矩阵和邻接表两种不同存储结构上实现图的基本运算的算 ...

最新文章

  1. java王者归来pdf_《JAVA WEB整合开发王者归来》刘京华.pdf
  2. 什么叫做“假学习”?
  3. 指令系统——数据存放、指令寻址(详解)
  4. Swiftfox:极速的冲浪体验
  5. Hadoop HA 深度解剖
  6. 禅道类似软件_项目管理软件之争,禅道和JIRA大对比
  7. java 值 继承_java中继承的数值传递引用
  8. java使用bks双向认证_android客户端SSL单向双向认证
  9. 最近的计算机网络新技术,计算机网络通信新技术的现状与发展趋势
  10. 泰坦尼克号乘客存活预测详细笔记
  11. 第九届蓝桥杯,赛后感!!含泪写完。
  12. android 颜色渐变扩散,Android 颜色渐变(gradient)的实现总结
  13. 51单片机教程:51单片机驱动四个8*8点阵,拼凑16*16点阵显示标准汉字。
  14. aws ecs 理解元数据和mock本地测试环境
  15. 南邮 OJ 1076 机器狗组装费用
  16. golang字符串拼接方式
  17. 一个工作了三年的社会人士与即将毕业的研究生对话:应届生什么时候准备找工作,如何准备?
  18. JavaScript之动画特效
  19. 大雁塔,青龙寺,樱花舞,落尘香
  20. 微信小程序 自动对对联

热门文章

  1. opencv3/C++ 机器学习-决策树/DTrees
  2. 用C语言给自己的奖状
  3. XSS 绕过思路 bypass 之日天日地日空气
  4. 大疆aeb连拍_一张图带你轻松读懂摄影必备专业术语~
  5. jQuery获取元素上一个、下一个、父元素、子元素
  6. eclipse运行java总显示上一个程序的运行结果(解决方案)
  7. 雷电模拟器如何启动某一特定应用 | ldconsole.exe runapp打开雷电内的APP没有任何反应怎么办
  8. vue实现一个类似浏览器搜索功能(ctrl + f)
  9. 设想无人值守的自动化测试方案
  10. 分享88个HTML旅游交通模板,总有一款适合您