void Print(Graph G){ int D[MVNum][MVNum]; int P[MVNum][MVNum]; for(int i=0;i<G.vexnum;++i){ for(int j=i+1;j<G.vexnum;++j){ printf("v%d-v%d weight:%d ", i, j, D[i][j]); //打印源点 终点 以及他们之前的权 int k = P[i][j]; //第一个路径顶点下标 printf(" path:%d", i); //打印源点 while (k != j) //如果没有到终点 { printf("-> %d", k); //打印路径顶点 k = P[k][j]; //获取下一个路径顶点下标 } printf(" -> %d\n", j); //打印终点 } printf("\n"); } } void Floyd(Graph G){ //弗洛伊德算法求无向图两点间最短距离 int D[MVNum][MVNum]; //D是存放权值的数组 int P[MVNum][MVNum]; //P是最短路径 for(int i=0;i<G.vexnum;++i){ for(int j=0;j<G.vexnum;++j){ D[i][j]=G.arcs[i][j]; //用G的邻接矩阵初始化D P[i][j]=j; } for(int i=0;i<G.vexnum;++i){ for(int j=0;j<G.vexnum;++j){ for(int w=0;w<G.vexnum;++w){ if(D[j][w]>D[j][i]+D[i][w]){ //如果经过下标为i的顶点路径比原两点间路径更短 D[j][w]=D[j][i]+D[i][w]; //更新D值 P[j][w]=P[j][i]; //更新P值 } } } } } Print(G); }错误和解释代码
时间: 2024-04-26 12:22:22 浏览: 13
这段代码存在一个错误,即在调用 Print(G) 函数时,传入的参数类型应该是 G,而不是 Graph 类型。因此,可以尝试将函数调用改为 Print(&G),这样可以正确地将 G 的地址传递给 Print 函数。
另外,这段代码实现了弗洛伊德算法,用于求解无向图中任意两个顶点之间的最短路径和对应的路径。具体实现的过程为:
1. 初始化 D 和 P 数组,其中 D 数组存放每个节点之间的最短路径权值,P 数组存放每个节点之间最短路径上的前驱节点。
2. 利用邻接矩阵初始化 D 数组和 P 数组。
3. 三重循环遍历每两个节点之间的最短路径,其中第一重循环表示中间节点的下标 i,第二重循环表示起点的下标 j,第三重循环表示终点的下标 w。
4. 如果经过中间节点 i 的路径比原两点间路径更短,则更新 D 值和 P 值。
5. 最后调用 Print(G) 函数,打印每个节点之间的最短路径和对应的路径。
总之,这段代码实现了弗洛伊德算法,用于求解无向图中任意两个顶点之间的最短路径和对应的路径。
相关问题
#include <stdio.h> #define MVNum 100 //最大顶点数 typedef struct{ char vexs[MVNum]; //存放顶点的一维数组 int arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和边数 }MGraph; void CreatMGraph(MGraph &G);/* 创建图 */ void printGraph(MGraph G);/*输出图 */ int locate(MGraph G,char v);//返回顶点v的下标 int main() { MGraph G; CreatMGraph(G);//创建图G printGraph(G);//打印该图 return 0; } void printGraph(MGraph G)//打印图 { int i,j; for(i=0;i<G.vexnum;i++) { printf("%c:",G.vexs[i]); for(j=0;j<G.vexnum;j++) if (G.arcs[i][j]) printf(" %c",G.vexs[j]); printf("\n"); } } /* 请在这里填写答案 */补全函数
题目要求补全一个函数,但并未说明是哪个函数,我猜测是指创建图的函数CreatMGraph,因此补全该函数如下:
```c
void CreatMGraph(MGraph &G) {
int i, j, k;
char v1, v2;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G.vexnum, &G.arcnum);
getchar(); // 读入回车符
printf("请输入顶点信息:\n");
for (i = 0; i < G.vexnum; i++) {
scanf("%c", &G.vexs[i]);
G.arcs[i][i] = 0; // 初始化邻接矩阵对角线为0
}
getchar(); // 读入回车符
printf("请输入每条边所连接的两个顶点:\n");
for (k = 0; k < G.arcnum; k++) {
scanf("%c%c", &v1, &v2);
getchar(); // 读入回车符
i = locate(G, v1);
j = locate(G, v2);
G.arcs[i][j] = G.arcs[j][i] = 1; // 无向图邻接矩阵对称
}
}
int locate(MGraph G, char v) {
int i;
for (i = 0; i < G.vexnum; i++) {
if (G.vexs[i] == v) {
return i;
}
}
return -1; // 未找到返回-1
}
```
修改下列代码要求如下:每组数据输出n-1行。为删除顶点后的邻接表。每两个数字之间用空格隔开。代码如下:#include<iostream> #include<string> #include<algorithm> #include<vector> #include<set> #include<map> using namespace std;typedef struct LNode {int data;struct LNode* next; }*linklist, LNode; typedef struct {int vexnum;int arcnum;linklist VList; }ALGragh; void CreateUDG(ALGragh& G, int n, int m) {G.arcnum = m;G.vexnum = n;G.VList = new LNode[n + 1];for (int i = 1; i <= n; i++){G.VList[i].data = i;G.VList[i].next = NULL;}int h, k;for (int i = 0; i < m; i++){cin >> h >> k;linklist p = new LNode, q = new LNode;p->data = h;p->next = G.VList[k].next;G.VList[k].next = p;q->data = k;q->next = G.VList[h].next;G.VList[h].next = q;} } void PrintGraph(ALGragh G) {for (int i = 1; i <= G.vexnum; i++){linklist p = &G.VList[i];while (p->next){cout << p->data << ' ';p = p->next;}cout << p->data << endl;} } void DeleteVex(ALGragh& G) {int h, k;cin >> h >> k;for (int i = 1; i <= G.vexnum ; i++){linklist p = &G.VList[i];if (i == h){if (p->next){if (p->next->data == k)p->next = p->next->next;}}if (i == k){if (p->next){if (p->next->data == h)p->next = p->next->next;}}} }
修改后的代码如下所示:
```
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next;
}*linklist, LNode;
typedef struct {
int vexnum;
int arcnum;
linklist VList;
}ALGragh;
void CreateUDG(ALGragh& G, int n, int m) {
G.arcnum = m;
G.vexnum = n;
G.VList = new LNode[n + 1];
for (int i = 1; i <= n; i++){
G.VList[i].data = i;
G.VList[i].next = NULL;
}
int h, k;
for (int i = 0; i < m; i++){
cin >> h >> k;
linklist p = new LNode, q = new LNode;
p->data = h;
p->next = G.VList[k].next;
G.VList[k].next = p;
q->data = k;
q->next = G.VList[h].next;
G.VList[h].next = q;
}
}
void PrintGraph(ALGragh G) {
for (int i = 1; i <= G.vexnum; i++){
linklist p = &G.VList[i];
while (p->next){
cout << p->data << ' ';
p = p->next;
}
cout << p->data << endl;
}
}
void DeleteVex(ALGragh& G) {
int h, k;
cin >> h >> k;
linklist p = G.VList[h].next;
while (p) {
if (p->data == k) {
G.VList[h].next = p->next;
break;
}
p = p->next;
}
p = G.VList[k].next;
while (p) {
if (p->data == h) {
G.VList[k].next = p->next;
break;
}
p = p->next;
}
}
int main() {
int n, m;
cin >> n >> m;
ALGragh G;
CreateUDG(G, n, m);
for (int i = 1; i <= n; i++) {
ALGragh temp = G;
DeleteVex(temp);
PrintGraph(temp);
}
return 0;
}
```
修改后的代码中,新增了一个 `main()` 函数,其中包含了循环删除每个顶点的代码。在 `DeleteVex()` 函数中,修改了删除顶点的逻辑,使其可以正确删除指定顶点,并且同时更新相邻顶点的邻接表。在每次删除顶点后,调用 `PrintGraph()` 函数输出邻接表即可。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)