void CreatMGraph(MGraph &G) { int i, j, k; scanf("%d%d", &G.vexnum, &G.arcnum); getchar(); //读取换行符 for (i = 0; i < G.vexnum; i++) { scanf("%c", &G.vexs[i]); getchar(); //读取换行符 } for (i = 0; i < G.vexnum; i++) for (j = 0; j < G.vexnum; j++) G.arcs[i][j] = 0; for (k = 0; k < G.arcnum; k++) { scanf("%d,%d", &i, &j); getchar(); //读取换行符 G.arcs[i][j] = 1; G.arcs[j][i] = 1; //无向图需要将两个方向都置为1 } for (i = 0; i < G.vexnum; i++) { printf("%d:", i); for (j = 0; j < G.vexnum; j++) { if (G.arcs[i][j] == 1) { printf(" %d", j); } } printf("\n"); } }
时间: 2024-04-02 09:31:13 浏览: 74
这段代码是用来创建一个无向图的邻接矩阵表示的函数。函数中的参数MGraph &G表示传入的图结构体变量的引用。函数首先读取输入的顶点数和边数,然后依次读取每个顶点的名称,并将邻接矩阵的所有位置初始化为0。接下来,循环读取每条边的起点和终点,并将其在邻接矩阵中的对应位置置为1(因为是无向图,所以需要将两个方向都置为1)。最后,函数输出邻接表表示的图。
需要注意的是,在读取顶点和边的输入时,需要使用getchar()函数读取换行符,否则会导致后面的输入读取错误。同时,该函数只适用于较小的图,因为邻接矩阵的空间复杂度为O(n^2),在图较大时会占用大量内存。
相关问题
void CreatMGraph(MGraph &G) { int i,j,k; scanf("%d,%d",&G.vexnum,&G.arcnum); for(i=0;i<G.vexnum;i++) for(j=0;j<G.vexnum;j++) G.arcs[i][j]=0; for(i=0;i<G.vexnum;i++) scanf("%c",&G.vexs[i]); for(k=0;k<G.arcnum;k++) { scanf("%d,%d",&i,&j); G.arcs[i][j]=1; } for(i=0;i<G.arcnum;j++) { printf("%d:",i); for(j=0;j<G.vexnum;j++) { for(k=0;k<G.vexnum;k++) { if(G.arcs[j][k]==1) { printf(" %d",k); } } } printf("\n"); } }
这是一个创建无向图的邻接矩阵的函数,代码中存在一些问题,我来解释一下:
```c++
void CreatMGraph(MGraph &G) {
int i,j,k;
scanf("%d,%d",&G.vexnum,&G.arcnum); // 输入节点数和边数
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=0; // 初始化邻接矩阵
for(i=0;i<G.vexnum;i++)
scanf("%c",&G.vexs[i]); // 输入节点名称
for(k=0;k<G.arcnum;k++) // 输入每条边的两个节点
{
scanf("%d,%d",&i,&j);
G.arcs[i][j]=1; // 将邻接矩阵中对应的位置赋值为1
G.arcs[j][i]=1; // 对称位置也赋值为1,因为是无向图
}
for(i=0;i<G.vexnum;i++) // 遍历每一个节点
{
printf("%d:",i);
for(j=0;j<G.vexnum;j++) // 遍历邻接矩阵中的每一行
{
if(G.arcs[i][j]==1) // 如果当前节点和邻接矩阵中的节点j有连接
{
printf(" %d",j); // 输出j节点的名称
}
}
printf("\n"); // 换行
}
}
```
代码中存在以下问题:
1. 在输入节点名称时,使用了`%c`格式化字符,这会导致输入时会把回车等非数字字符也读入,可以使用`%s`格式化字符串来输入节点名称,或者在输入节点名称前加上一个空格,如`scanf(" %c",&G.vexs[i])`。
2. 在遍历每一个节点时,输出格式有误。应该是输出当前节点的名称后,再遍历与该节点有连接的节点,输出这些节点的名称。
3. 在遍历每一个节点时,只需要遍历邻接矩阵中的该节点所在行,而不需要遍历整个邻接矩阵,可以将第二个for循环的结束条件改为`j<G.vexnum`。
4. 在遍历每一个节点时,输出的节点名称应该从0开始,而不是从i开始。
在网中,一个顶点可能会有若干个邻接点。有的邻接点离该顶点距离近,有的邻接点与该顶点距离远,本题要求实现一个函数,输出某个顶点的最近邻接点的值以及与最近邻接点相关联的边上的权值。 函数接口定义: void shortest_adj (MGraph G,int v); G为采用邻接矩阵作为存储结构的网,v是顶点编号,要求输出顶点v的最近邻接点的值。顶点v的最近邻接点是v的所有邻接点中权值最小的邻接点,若v行w列的值为无穷,则w不是v的邻接点。(题目保证最近邻接点存在并是唯一的) 裁判测试程序样例: #include <stdio.h> #define MVNum 100 //最大顶点数 int inf=1<<30;//inf表示无穷 typedef struct { char vexs[MVNum]; //存放顶点的一维数组 int arcs[MVNum][MVNum]; //网的邻接矩阵 int vexnum, arcnum; //图的当前顶点数和边数 }MGraph; void shortest_adj (MGraph G,int v); void CreatMGraph(MGraph G);/ 创建图 */ int main() { MGraph G; CreatMGraph(&G); int v; scanf("%d",&v); shortest_adj(G, v); return 0; } void CreatMGraph(MGraph G) { int i, j, k,w; scanf("%d%d", &G->vexnum, &G->arcnum); getchar(); for (i = 0; i < G->vexnum; i++) scanf("%c", &G->vexs[i]); for (i = 0; i < G->vexnum; i++) for (j = 0; j < G->vexnum; j++) G->arcs[i][j] = inf;//邻接矩阵元素初值均为无穷 for (k = 0; k < G->arcnum; k++) { scanf("%d%d%d", &i, &j,&w); G->arcs[i][j] = w; G->arcs[j][i] = w; } } / 你的代码将被嵌在这里 */
void shortest_adj(MGraph G, int v) {
int min_weight = inf, min_index = -1;
for (int i = 0; i < G.vexnum; i++) {
if (G.arcs[v][i] != inf && G.arcs[v][i] < min_weight) {
min_weight = G.arcs[v][i];
min_index = i;
}
}
printf("%c %d", G.vexs[min_index], min_weight);
}
// 解释:先设最小权值为无穷大,最小邻接点编号为-1,遍历顶点v的所有邻接点,如果该邻接点存在且权值小于当前最小权值,则更新最小权值和最小邻接点编号。最后输出最小邻接点编号对应的顶点和最小权值。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.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)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)