for (int i = 1; i <= G.vexnum; i++) { closeedges[i].end_ver = 1; closeedges[i].lowcost = G.arcs[1][i]; closeedges[i].flag = 0; } closeedges[1].flag = 1; int min; for (int i = 2; i <= G.vexnum; i++) { min = -1; for (int j = 1; j <= G.vexnum; j++) { if (closeedges[j].flag == 0 && (closeedges[j].lowcost > 0 && (min < 0 || closeedges[min].lowcost>closeedges[j].lowcost))) min = j; } closeedges[min].flag = 1; setlinecolor(GREEN); setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 5); draw_arc(G.vexs[closeedges[min].end_ver], G.vexs[min], closeedges[min].lowcost); setlinecolor(RED); setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 1); setfillcolor(MAGENTA); for (int i = 1; i <= G.vexnum; i++) { draw_vex(G.vexs[i], i); } Sleep(1000); for (int j = 2; j <= G.vexnum; j++) { if (closeedges[j].flag == 0 && (G.arcs[j][min] > 0 && (closeedges[j].lowcost < 0 || closeedges[j].lowcost > G.arcs[j][min]))) { closeedges[j].end_ver = min; closeedges[j].lowcost = G.arcs[j][min];
时间: 2023-03-14 18:20:45 浏览: 91
为每个顶点i,将closeedges[i].end_ver设为1,closeedges[i].lowcost设为G.arcs[1][i],closeedges[i].flag设为0;将closeedges[1].flag设为1;循环遍历每个顶点,找出最小的closeedges[j].lowcost,将其flag设为1,并将min设为j。
相关问题
for (int i = 0; i < (graph.vexnum); i++) { graph.vexs[i] = city[i]; } //初始化二维矩阵 for (i = 0; i < (graph.vexnum); i++) { for (j = 0; j < (graph.vexnum); j++) { graph.arcs[i][j].cost = INFINITY; graph.arcs[i][j].time = INFINITY; } } //添加弧数据 for (int i = 0; i < graph.arcnum; i++) { int sta = LocateVex(route[i].start_city, city); int end = LocateVex(route[i].end_city, city); graph.arcs[sta][end].cost = route[i].cost; graph.arcs[sta][end].time = route[i].time; } }
这段代码是创建图的函数的续部,其中 Graph 是一个图的数据结构,包括节点和边,City 是一个城市信息的结构体,Route 是一条路线信息的结构体。具体来讲,这段代码的作用是:
1. 将城市数组 city 中的每个城市信息复制到图的节点数组 graph.vexs 中对应的位置上。
2. 初始化图的邻接矩阵 graph.arcs,将每个边的长度和时间都设置为无穷大(即表示不可达)。
3. 遍历路线数组 route,对于每条路线,根据其起点和终点在城市数组 city 中的索引,将该路线的长度和时间分别存储在图的邻接矩阵 graph.arcs 中对应的位置上。
需要注意的是,这段代码中使用了 LocateVex 函数来查找城市在城市数组 city 中的索引。同时使用了 INFINITY 宏定义来表示边的长度和时间为无穷大。
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开始。
阅读全文