目录
1、根据实验内容描述需求分析:
(1)输入的形式和输出值的范围;输入的形式:输入汉字或者字符(按照控制台的提示来输入)
输出值的范围:就是输出深度优先遍历的结果,及创建图的最小生成树后打印出各个地点的最小值(权值)(2)输出的形式;按功能顺序输出;(3)程序所能达到的功能;邻接矩阵创建无向图;深度优先遍历;创建图的最小生成树;
2、主程序的流程及各程序模块之间的调用关系:
Locatevertes(Graph &G,string v):判断顶点v的位置下标;
CreateG(Graph &G):采用邻接矩阵表示法创建无向图;
Dfs_ergodic(Graph &G,int v):深度优先遍历函数;
Min(Graph &G,struct PL closedge[]):判断closedge[i].lowcost中的最小值并返回;
minTree_prim(Graph &G,string u):prim算法实现图的最小生成树的函数;
test():用来测试数据的函数;
3、相关函数代码展示:
(1)深度优先遍历函数实现![](https://img-blog.csdnimg.cn/a31d4d6391394bc08ba980c855912dd5.jpeg)
//深度优先遍历
void Dfs_ergodic(Graph &G,int v){
//从第v个顶点出发深度优先搜索
cout<<endl;
cout<<G.vertexs[v]<<" ";
visited[v]=true;
for(int w=0;w<G.vertexnum;w++){
if((G.arcx[v][w]!=maxint)&&(!visited[w])){
Dfs_ergodic(G,w);
}
}
}
(2)广度优先遍历函数实现
//广度优先遍历
void Bfs_ergodic(Graph &G,int v){
}
//判断 closedge[i].lowcost中的最小值并返回
int Min(Graph &G,struct PL closedge[]){
int i=0,k=0;
//注意:int min不要等于closedge[i].lowcost (如果其为0就违背了closedge[i].lowcost!=0这个条件)
int min = maxint;
for(i=1;i<G.vertexnum;i++){
if(closedge[i].lowcost<min&&closedge[i].lowcost!=0){
min=closedge[i].lowcost;
k=i;
}
}
return k;
}
4、源码分析:
(1)程序中的相关函数:
#define maxint 32767
#define max 100
#define OK 1
using namespace std;
typedef struct GraphP{
string vertexs[max];
int arcx[max][max];
int vertexnum,edgesnum;
}Graph,*GRaph;
//普里姆算法辅助数组的定义
typedef struct PL{
string adjvex;
int lowcost;
}F;
Graph G;
bool visited[max];
//因为还没有输入顶点的个数所以不能bool visited[G.vertexnum]
//F closedge[max];
//判断两个顶点位置的函数用于将权值存入邻接矩阵中
int Locatevertes(Graph &G,string v){
for(int i=0;i<G.vertexnum;i++){
if(G.vertexs[i]==v){
return i;
}
}
return 0;
}
//采用邻接矩阵表示法创建无向图
bool CreateG(Graph &G){
int w,e1,e2;
string v1,v2;
cout<<"请输入总顶点数以及总边数:"<<endl;
cin>> G.vertexnum>>G.edgesnum;
cout<<"请依次输入顶点的信息:"<<endl;
for(int i=0;i<G.vertexnum;i++){
cin>>G.vertexs[i];
}
//初始化邻接矩阵
for(int i=0;i<G.vertexnum;i++){
for(int j=0;j<G.vertexnum;j++){
G.arcx[i][j]=maxint;
}
}
cout<<"请输入一条边依附的顶点及权值:"<<endl;
for(int k=0;k<G.edgesnum;k++){
cin>>v1>>v2>>w;
e1=Locatevertes(G,v1);
e2=Locatevertes(G,v2);
G.arcx[e1][e2]=w;
G.arcx[e2][e1]=G.arcx[e1][e2];
}
return OK;
}
//深度优先遍历
void Dfs_ergodic(Graph &G,int v){
//从第v个顶点出发深度优先搜索
cout<<endl;
cout<<G.vertexs[v]<<" ";
visited[v]=true;
for(int w=0;w<G.vertexnum;w++){
if((G.arcx[v][w]!=maxint)&&(!visited[w])){
Dfs_ergodic(G,w);
}
}
}
//广度优先遍历
void Bfs_ergodic(Graph &G,int v){
}
//判断 closedge[i].lowcost中的最小值并返回
int Min(Graph &G,struct PL closedge[]){
int i=0,k=0;
int min = maxint;
for(i=1;i<G.vertexnum;i++){
if(closedge[i].lowcost<min&&closedge[i].lowcost!=0){
min=closedge[i].lowcost;
k=i;
}
}
return k;
}
//实现图的最小生成树(普里姆算法)或(克鲁斯卡尔算法)
void minTree_prim(Graph &G,string u){
//从顶点u出发构造最小生成树T
string u0,v0;
F closedge[max];
int k = Locatevertes(G,u);
for(int j=0;j<G.vertexnum;j++){
if(j!=k){
closedge[j]={u,G.arcx[k][j]};
}
}
closedge[k].lowcost=0;
for(int i=1;i<G.vertexnum;i++){
k=Min(G,closedge);
u0=closedge[k].adjvex;
v0=G.vertexs[k];
cout<<"输出当前最小边为:";
cout<<'('<<u0<<','<<v0<<')'<<endl;
closedge[k].lowcost=0;
for(int j=0;j<G.vertexnum;j++){
if(G.arcx[k][j]<closedge[j].lowcost){
closedge[j]={G.vertexs[k],G.arcx[k][j]};
}
}
}
}
//最短路径的算法 (Dijkstra 算法)
void shortest_puth(Graph &G,int v0){
}
bool test(){
string u;
int q;
if(CreateG(G)){
cout<<"无向图创建成功!!"<<endl;
}
//辅助数组来确定是否遍历过 先初始化为false
for(int i=0;i<max;i++){
visited[i]=false;
}
cout<<"输入q为从第几个顶点开始的深度优先遍历(0、1、2、3)"<<endl;
cin>>q;
cout<<"深度优先遍历为:"<<endl;
Dfs_ergodic(G,q);
cout<<"输入最小生成树的起始地点:【b(北京)、s(上海)、t(台北)、x(香港)】"<<endl;
cin>>u;
minTree_prim(G,u);
return OK;
}
//改进visited【】改为数量为G.vertexnum个数量
//待完成
(2)函数调用过程:
int i=1;
cout<<"输入1为创建图___输入0为结束程序:"<<" ";
cin>>i;
while(i){
system("cls");
test();
cout<<"如果不想要再次创建图输入0若是继续输入1:"<<endl;
cin>>i;
}
system("pause");
5、输入输出结果展示:
小结:该程序的实现就是简单的实现了城市间路径问题读者可以依照自身兴趣进行升华加工算法
博主制作文章需要付出时间和心血制作不易!!如果对你有帮助的话 不妨点个赞噢