#include <stdio.h> #include <stdlib.h> #define MVNum 100 int visited[MVNum]; typedef struct{ int vexs[MVNum]; //顶点向量,各小岛对应积分 int arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //顶点数,边数 }AMGraph; void CreateUDG(AMGraph &G); //创建图,采用邻接矩阵存储 int DFS(AMGraph G, int v);//以v为起点深度优先遍历,求出各顶点值的和作为返回值 int LocateVex(AMGraph G,int u) //查询顶点u的下标 { int i; for(i=0;i<G.vexnum;++i) if(u==G.vexs[i] ) return i; return -1; } int main(){ AMGraph G; int i; CreateUDG(G); for(i=0;i<G.vexnum;i++){ visited[i]=0; } i=LocateVex(G,0); //找到起点下标 if(i>=0) printf("\n%d",DFS(G,i)); return 0; } /* 请在这里填写答案 */
时间: 2024-03-14 17:44:51 浏览: 63
根据题目要求,我们需要实现以下几个步骤:
1. 定义邻接矩阵存储图结构。
2. 创建图。
3. 实现深度优先遍历算法,求出各顶点值的和。
4. 在主函数中调用上述函数,输出结果。
下面是完整的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MVNum 100
int visited[MVNum];
typedef struct{
int vexs[MVNum]; //顶点向量,各小岛对应积分
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //顶点数,边数
}AMGraph;
void CreateUDG(AMGraph &G) //创建图,采用邻接矩阵存储
{
int i,j,k;
printf("请输入小岛数和边数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("请输入小岛名称和积分:\n");
for(i=0;i<G.vexnum;++i){
scanf("%d",&G.vexs[i]);
}
for(i=0;i<G.vexnum;++i){
for(j=0;j<G.vexnum;++j){
G.arcs[i][j]=0;
}
}
printf("请输入各边的两个顶点:\n");
for(k=0;k<G.arcnum;++k){
scanf("%d%d",&i,&j);
i=LocateVex(G,i);
j=LocateVex(G,j);
G.arcs[i][j]=1;
G.arcs[j][i]=1;
}
}
int DFS(AMGraph G, int v)//以v为起点深度优先遍历,求出各顶点值的和作为返回值
{
int i,sum=G.vexs[v];
visited[v]=1;
for(i=0;i<G.vexnum;++i){
if(G.arcs[v][i]&&!visited[i]){
sum+=DFS(G,i);
}
}
return sum;
}
int LocateVex(AMGraph G,int u) //查询顶点u的下标
{
int i;
for(i=0;i<G.vexnum;++i)
if(u==G.vexs[i] )
return i;
return -1;
}
int main(){
AMGraph G;
int i;
CreateUDG(G);
for(i=0;i<G.vexnum;i++){
visited[i]=0;
}
i=LocateVex(G,0); //找到起点下标
if(i>=0)
printf("\n%d",DFS(G,i));
return 0;
}
```
注意,该代码实现了题目要求的功能,但是还有一些细节问题需要注意,例如输入格式、输入数据的合法性等。同时,该实现方式使用了邻接矩阵存储,对于较大规模的图可能会导致空间占用过大,因此在实际应用中需要根据具体情况选择更适合的图存储方式。
阅读全文