for (v = 0; v < G.vexNum; v++)
时间: 2023-10-19 19:07:30 浏览: 38
这行代码是一个for循环,用于遍历图中所有顶点,其中:
- 变量v表示当前遍历到的顶点编号,从0开始逐个增加,直到遍历完所有顶点;
- G.vexNum表示图的顶点数,即循环的结束条件,当v达到G.vexNum时,循环结束。
该循环通常用于初始化或对所有顶点进行某种操作,例如在Dijkstra算法中,该循环用于初始化final、dist和path数组;在Prim算法中,该循环用于初始化U集合和key数组。
相关问题
void ShortestPath_DIJ(MGraph G,int v0,int(*P)[MAX_VERTEX_NUM][MAX_VERTEX_NUM],int(*D)[MAX_VERTEX_NUM]) { int v,w,i,min,j; int final[MAX_VERTEX_NUM]; for (v=0;v<G.vexnum;++v) { final[v]=FALSE; D[v]=G.arcs[v0][v].adj; for (w=0;w<G.vexnum;++w)//设空路径 { P[v][w]=FALSE; } if (D[v]<INFINITY) { P[v][v0]=TRUE; P[v][v]=TRUE; } } D[v0]=0; final[v0]=TRUE;//初始化,v0顶点属于S集 //开始主循环,每次求得v0到某个顶点的最短路径 for (i=1;i<G.vexnum;++i)//其余顶点 { min=INFINITY; for(w=0;w<G.vexnum;++w) { if (final[w]!=TRUE)//w顶点在V-S中 if (D[w]<min)//找离V0最近的点 { v=w; min=D[w]; } } final[v]=TRUE; for (w=0;w<G.vexnum;++w)//更新当前最短路径及距离 if (final[w]!=TRUE&&(min+G.arcs[v][w].adj<D[w])) { D[w]=min+G.arcs[v][w].adj; for (j=0;j<G.vexnum;++j) { P[w][j]=P[v][j]; } P[w][w]=TRUE;//p[w]=p[v]+[w]更换路径 } } }修改为c语言代码
好的,这是修改后的C语言代码:
```c
void ShortestPath_DIJ(MGraph G, int v0, int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM], int D[MAX_VERTEX_NUM]) {
int v, w, i, min, j;
int final[MAX_VERTEX_NUM];
for (v = 0; v < G.vexnum; ++v) {
final[v] = FALSE;
D[v] = G.arcs[v0][v].adj;
for (w = 0; w < G.vexnum; ++w) {
P[v][w] = FALSE;
}
if (D[v] < INFINITY) {
P[v][v0] = TRUE;
P[v][v] = TRUE;
}
}
D[v0] = 0;
final[v0] = TRUE;
for (i = 1; i < G.vexnum; ++i) {
min = INFINITY;
for (w = 0; w < G.vexnum; ++w) {
if (final[w] != TRUE) {
if (D[w] < min) {
v = w;
min = D[w];
}
}
}
final[v] = TRUE;
for (w = 0; w < G.vexnum; ++w) {
if (final[w] != TRUE && (min + G.arcs[v][w].adj < D[w])) {
D[w] = min + G.arcs[v][w].adj;
for (j = 0; j < G.vexnum; ++j) {
P[w][j] = P[v][j];
}
P[w][w] = TRUE;
}
}
}
}
```
其中,MAX_VERTEX_NUM是顶点的最大个数,INFINITY表示无穷大。注意,这里的P数组存储的是布尔型值,表示是否经过了该顶点;而D数组存储的是最短路径的长度。
#include<stdio.h> #include<stdbool.h> #define MAX_VERTEX_NUM 50 typedef struct{ int vertex[MAX_VERTEX_NUM]; int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum; }MGraph; void InitMGraph(MGraph*G) { int i,j; for(i=0;i<G->vexnum;i++) { for(j=0;j<G->vexnum;j++) { G->arc[i][j]=0; } } } void DFS(MGraph G,bool *visited,int v) { int w; visited[v]=true; printf("%d ",v); for(w=0;w<G.vexnum ;w++) { if(G.arc[v][w]!=0&&!visited[w]) { DFS(G,visited,w); } } } void DFSTraverse(MGraph G) { int v; bool visited[MAX_VERTEX_NUM]; for(v=0;v<G.vexnum;v++) { visited[v]=false; } for(v=0;v<G.vexnum;v++) { if(!visited[v]) { DFS(G,visited,v); } } } int FirstAdjVex(MGraph G,int v)//查找第一个临界点 { int w; for(w=0;w<G.vexnum;w++) { if(G.arc[v][w]!=0) return w; } return -1; } int NextAdjVex(MGraph G,int v,int w)//查找下一个临界点 { int i; for(i=w+1;i<G.vexnum;i++) { if(G.arc[v][i]!=0) { return i; } } return -1; } int main() { MGraph G; int i,j; scanf("%d",&G.vexnum); for(i=0;i<G.vexnum;i++) { scanf("%d",&G.vertex[i]); } InitMGraph(&G); for(i=0;i<G.vexnum;i++) { scanf("%d",&G.vertex[i]); for(j=0;j<G.vexnum;j++) { scanf("%d",&G.arc[i][j]); } } DFSTraverse(G); printf("\n"); return 0; } 代码应如何修改才能保证输入4 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0矩阵,输出结果是0 1 3 2修改后的代码是什么
代码中存在一处错误,第7行应该是 `#define MAX_VERTEX_NUM 100`,因为题目中给出了最大顶点数是50,但是顶点编号从0开始,因此数组大小应该为最大顶点数加1。同时,第20行应该是 `scanf("%d",&G.vertex[i]);`,因为这里是输入顶点编号而不是输入顶点个数。修改后的代码如下:
```
#include<stdio.h>
#include<stdbool.h>
#define MAX_VERTEX_NUM 100
typedef struct{
int vertex[MAX_VERTEX_NUM];
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum;
}MGraph;
void InitMGraph(MGraph*G) {
int i,j;
for(i=0;i<=G->vexnum;i++) {
for(j=0;j<=G->vexnum;j++) {
G->arc[i][j]=0;
}
}
}
void DFS(MGraph G,bool *visited,int v) {
int w;
visited[v]=true;
printf("%d ",v);
for(w=0;w<G.vexnum ;w++) {
if(G.arc[v][w]!=0&&!visited[w]) {
DFS(G,visited,w);
}
}
}
void DFSTraverse(MGraph G) {
int v;
bool visited[MAX_VERTEX_NUM];
for(v=0;v<=G.vexnum;v++) {
visited[v]=false;
}
for(v=0;v<G.vexnum;v++) {
if(!visited[v]) {
DFS(G,visited,v);
}
}
}
int FirstAdjVex(MGraph G,int v)//查找第一个临界点 {
int w;
for(w=0;w<G.vexnum;w++) {
if(G.arc[v][w]!=0)
return w;
}
return -1;
}
int NextAdjVex(MGraph G,int v,int w)//查找下一个临界点 {
int i;
for(i=w+1;i<G.vexnum;i++) {
if(G.arc[v][i]!=0) {
return i;
}
}
return -1;
}
int main() {
MGraph G;
int i,j;
scanf("%d",&G.vexnum);
for(i=0;i<G.vexnum;i++) {
scanf("%d",&G.vertex[i]);
}
InitMGraph(&G);
for(i=0;i<G.vexnum;i++) {
for(j=0;j<G.vexnum;j++) {
scanf("%d",&G.arc[i][j]);
}
}
DFSTraverse(G);
printf("\n");
return 0;
}
```