1.请把下图以邻接矩阵的结构存储,并打印输出此邻接矩阵。 图片内容为:B→E权值8 F→E权值18 C→F权值7 E→D权值4 F→D权值10 A→D权值30 C→B权值15 A→C权值5 B→A权值2 提示:图的创建代码参考教材例题。首先构建图的逻辑模型,得出该图的顶点集和边集,调用相应的函数生成图的邻接矩阵,并打印出邻接矩阵。 2.根据上一题的邻接矩阵,编程实现该图的深度与广度优先遍历算法,从顶点A开始遍历,分别输出深度与广度优先遍历序列。 3.单源节点最短路径问题(选做) 问题描述:求从有向图的某一结点出发到其余各结点的最短路径。 基本要求: (1)有向图采用邻接矩阵表示。 (2)单源节点最短路径问题采用Dijkstra算法。 (3)输出有向图中从源结点A到其余各结点的最短路径和最短路径值。
时间: 2024-03-10 10:46:34 浏览: 123
基于邻接矩阵存储的图的最短路径问题
3星 · 编辑精心推荐
很好,我会根据你的问题进行回答。
1. 邻接矩阵的存储和输出:
首先,根据提供的图示,我们可以得出该图的顶点集为{A,B,C,D,E,F},边集为{(B,E,8),(F,E,18),(C,F,7),(E,D,4),(F,D,10),(A,D,30),(C,B,15),(A,C,5),(B,A,2)}。
然后,我们可以调用以下函数生成图的邻接矩阵,并输出该邻接矩阵:
```c++
#define MAX_VERTEX_NUM 20
#define VRType int
#define InfoType char
#define VertexType char
typedef struct ArcCell{
VRType adj; //顶点关系类型。对于无权图,用1或0表示是否相邻;对于带权图,为权值类型。
InfoType *info; //该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
AdjMatrix arcs; //邻接矩阵
VertexType vexs[MAX_VERTEX_NUM]; //存储图中顶点的数组
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
void CreateGraph(MGraph &G){
//创建图的邻接矩阵
int i,j,k;
VRType w;
printf("请输入顶点数和弧数:");
scanf("%d,%d",&G.vexnum,&G.arcnum);
getchar(); //吃掉回车符
printf("请输入%d个顶点的信息:\n",G.vexnum);
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].adj=0;
G.arcs[i][j].info=NULL;
}
printf("请输入%d条弧的信息:\n",G.arcnum);
for(k=0;k<G.arcnum;k++){
printf("请输入第%d条弧的起点:",k+1);
VertexType v1,v2;
VRType w;
int v1_index,v2_index;
scanf("%c",&v1);
getchar(); //吃掉回车符
printf("请输入第%d条弧的终点:",k+1);
scanf("%c",&v2);
getchar(); //吃掉回车符
printf("请输入第%d条弧的权值:",k+1);
scanf("%d",&w);
getchar(); //吃掉回车符
v1_index=LocateVex(G,v1);
v2_index=LocateVex(G,v2);
G.arcs[v1_index][v2_index].adj=w;
}
}
void PrintGraph(MGraph G){
//打印邻接矩阵
int i,j;
printf("该图的邻接矩阵为:\n");
for(i=0;i<G.vexnum;i++){
for(j=0;j<G.vexnum;j++)
printf("%d\t",G.arcs[i][j].adj);
printf("\n");
}
}
int LocateVex(MGraph G,VertexType v){
//定位顶点v在图中的位置
int i;
for(i=0;i<G.vexnum;i++)
if(G.vexs[i]==v)
return i;
return -1;
}
int main(){
MGraph G;
CreateGraph(G);
PrintGraph(G);
return 0;
}
```
2. 深度与广度优先遍历算法的实现:
接下来,我们可以根据图的邻接矩阵,编程实现该图的深度与广度优先遍历算法。从顶点A开始遍历,分别输出深度与广度优先遍历序列。具体实现代码如下:
```c++
#define MAX_VERTEX_NUM 20
#define VRType int
#define InfoType char
#define VertexType char
typedef struct ArcCell{
VRType adj; //顶点关系类型。对于无权图,用1或0表示是否相邻;对于带权图,为权值类型。
InfoType *info; //该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
AdjMatrix arcs; //邻接矩阵
VertexType vexs[MAX_VERTEX_NUM]; //存储图中顶点的数组
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
void CreateGraph(MGraph &G){
//创建图的邻接矩阵
int i,j,k;
VRType w;
printf("请输入顶点数和弧数:");
scanf("%d,%d",&G.vexnum,&G.arcnum);
getchar(); //吃掉回车符
printf("请输入%d个顶点的信息:\n",G.vexnum);
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].adj=0;
G.arcs[i][j].info=NULL;
}
printf("请输入%d条弧的信息:\n",G.arcnum);
for(k=0;k<G.arcnum;k++){
printf("请输入第%d条弧的起点:",k+1);
VertexType v1,v2;
VRType w;
int v1_index,v2_index;
scanf("%c",&v1);
getchar(); //吃掉回车符
printf("请输入第%d条弧的终点:",k+1);
scanf("%c",&v2);
getchar(); //吃掉回车符
printf("请输入第%d条弧的权值:",k+1);
scanf("%d",&w);
getchar(); //吃掉回车符
v1_index=LocateVex(G,v1);
v2_index=LocateVex(G,v2);
G.arcs[v1_index][v2_index].adj=w;
}
}
void PrintGraph(MGraph G){
//打印邻接矩阵
int i,j;
printf("该图的邻接矩阵为:\n");
for(i=0;i<G.vexnum;i++){
for(j=0;j<G.vexnum;j++)
printf("%d\t",G.arcs[i][j].adj);
printf("\n");
}
}
int LocateVex(MGraph G,VertexType v){
//定位顶点v在图中的位置
int i;
for(i=0;i<G.vexnum;i++)
if(G.vexs[i]==v)
return i;
return -1;
}
void DFS(MGraph G,int v,bool *visited){
//从顶点v开始进行深度优先遍历
visited[v]=true;
printf("%c ",G.vexs[v]);
int i;
for(i=0;i<G.vexnum;i++)
if(G.arcs[v][i].adj!=0 && !visited[i])
DFS(G,i,visited);
}
void DFSTraverse(MGraph G){
//深度优先遍历
bool visited[MAX_VERTEX_NUM];
int i;
for(i=0;i<G.vexnum;i++)
visited[i]=false;
for(i=0;i<G.vexnum;i++)
if(!visited[i])
DFS(G,i,visited);
}
void BFS(MGraph G,int v,bool *visited){
//从顶点v开始进行广度优先遍历
int queue[MAX_VERTEX_NUM],front=0,rear=0;
visited[v]=true;
printf("%c ",G.vexs[v]);
queue[rear++]=v;
while(front!=rear){
int k=queue[front++];
int i;
for(i=0;i<G.vexnum;i++)
if(G.arcs[k][i].adj!=0 && !visited[i]){
visited[i]=true;
printf("%c ",G.vexs[i]);
queue[rear++]=i;
}
}
}
void BFSTraverse(MGraph G){
//广度优先遍历
bool visited[MAX_VERTEX_NUM];
int i;
for(i=0;i<G.vexnum;i++)
visited[i]=false;
for(i=0;i<G.vexnum;i++)
if(!visited[i])
BFS(G,i,visited);
}
int main(){
MGraph G;
CreateGraph(G);
PrintGraph(G);
printf("深度优先遍历序列为:");
DFSTraverse(G);
printf("\n广度优先遍历序列为:");
BFSTraverse(G);
return 0;
}
```
3. 单源节点最短路径问题(选做):
如果需要解决单源节点最短路径问题,可以采用Dijkstra算法。由于时间和篇幅有限,这里不再进行详细介绍。如果你有相关需求,可以参考一下Dijkstra算法的实现方法。
阅读全文