Source.cpp
上传用户:yingjiejs
上传日期:2022-06-05
资源大小:841k
文件大小:5k
- #include "Head.h"
- #include <stdio.h>
- //初始化图的信息
- void InitGraph(MGraph &M,int* a,string* v,string *no,string *vifo,string arcifos[][8], int n )
- {
- int i,j;
- M.vertexNum=n;
- for (i=0; i<MaxSize; i++)
- {
- for (j=0; j<MaxSize; j++)
- M.arc[i][j] = MAX;
- }
-
- for ( i=0; i<M.vertexNum; i++)
- {
- M.vertex[i]=v[i]; //对节点名称赋值
- M.vno[i]=no[i]; //对弧信息进行赋值(存导游系统中的节点的代号)
- M.ifo[i]=vifo[i]; //对边的信息(存导游系统中的节点简介)
- }
-
- for (i=0; i<M.vertexNum; i++)
- {
- for (j=0; j<M.vertexNum; j++)
- {
- M.arc[i][j]=*(a+i*n+j);
- M.arcifo[i][j]=arcifos[i][j];
- }
- }
- }
- //输出整张图的信息
- void PutOutVexInfo(MGraph &M)
- {
- printf("名称ttt代号tt简介nn");
- for(int i=0;i<M.vertexNum;i++)
- {
- printf("%stt%stt%sn",M.vertex[i].c_str(),M.vno[i].c_str(),M.ifo[i].c_str());
- }
- }
- //输出从所有的边的权重
- void PutOutArcInfo(MGraph &M)
- {
- printf("所有的边的信息为:n");
- for(int i=0;i<M.vertexNum;i++)
- for(int j=0;j<i;j++)
- {
- if(M.arc[i][j]<MAX)
- {
- printf("从 %s 到 %s 的路径长度为:",M.vertex[i].c_str(),M.vertex[j].c_str());
- printf("%4d",M.arc[i][j]);
- printf("路名:%sn",M.arcifo[i][j].c_str());
- }
- }
- }
- //改变某一条弧的权重
- void SetArc(MGraph &M,int v1,int v2,int arclength)
- {
- //输入的V1和V2不存就出现异常
- if ( v1>M.vertexNum|| v2>M.vertexNum)
- {
- printf("v1或者v2的值不合法!n");
- return;
- }
- else
- { M.arc[v1][v2]=arclength;
- M.arc[v2][v1]=arclength;
- }
- printf("从%s到%s的路径长度为:%d",M.vertex[v1].c_str(),M.vertex[v2].c_str(),M.arc[v1][v2]);
- }
- //删除某一个弧
- void DeleteArc(MGraph &M,int n, int w)
- {
- if ( n>MaxSize|| w>MaxSize)
- {
- printf("输入的n或者w不合法n");
- return;
- }
- M.arc[n][w]=M.arc[w][n]=MAX;
- printf("删除成功!n");
- printf("删除后整张图的路径情况:n");
- PutOutArcInfo(M);
- }
- //到某个顶点的路径
- void to_vex(MGraph &M,int endv)
- {
- if (endv <M.vertexNum && endv >=0 && endv!=beginv)
- {
- string mmm=""; //初始化字符串
- int j =endv;
- while(j > -1 )
- {
- string nnn =M.vertex[j]; //依次把顶点存放在nnn字符串中
- nnn+=mmm;
- mmm = " "+nnn;
- j = path[j];
- }
- printf("从到%s到%s的路径长度为:",M.vertex[beginv].c_str(),M.vertex[endv].c_str());
- printf("%4d",dist[endv]);
- printf("路径:%sn",mmm.c_str());
- }
- }
- void to_vexs(MGraph &M)
- {
- for(int i=0;i<M.vertexNum;i++)
- to_vex(M,i);
- }
- //求最短路径,从v顶点到endv点的最短路径
- void Dijkstra(MGraph &M,int beginv1,int endv1,int road)
- {
- v=beginv=beginv1;endv=endv1;
- int oldway=-1;
- //v顶点或endv顶点输出不正确则结束
- if ( beginv>=M.vertexNum ||beginv<0 ||endv>=M.vertexNum || endv<0)
- {
- return;
- }
- int i,j,k,wm;
- for(i=0;i<M.vertexNum;i++)//按网的邻接矩阵确定各顶点最短路径的初值
- {
- dist[i]=M.arc[v][i];
- if(i!=v&& dist[i]< MAX)//如果v、i之间有路
- path[i]=v; //当前找到的最短路径为v
- else
- path[i]=-1; //否则v与i顶点不存在路径
- s[i] = 0; //给s集合确定初值0
- }
-
- s[v]=1;dist[v]=0; //将顶点v本身排除在外
- for(k =0;k<M.vertexNum-1;k++)//求其他numv-1各顶点的最短路径
- {
- wm = MAX;
- j=beginv; //确定当前最短路径wm及顶点的序号j
- oldway=path[endv];
- for( i=0;i<M.vertexNum;i++)
- {
- if(!s[i]&&dist[i]<wm)//如果v、i之间有路
- {
- j=i;
- wm = dist[i]; //把当前找到的路径确定为最大值
- }
- }
- s[j]=1;
- for(i =0;i<M.vertexNum;i++) //更新未确定最短路径各顶点的当前最短路径
- {
- if(!s[i]&&dist[j]+M.arc[j][i]<dist[i]) //如果v、i两点的距离加上i、j小于从v点到j点的距离
- {
- dist[i]=dist[j]+M.arc[j][i];
- path[i]=j;
- }
- }
- if(road==MUL && oldway!=path[endv] )
- {
- printf("前最短路径:n");
- to_vex(M,endv);
- }
- }
- printf("n");
- if(road==EVERYONE)
- {
- printf("最短路径:n");
- to_vexs(M);
- }
- else
- {
- printf("最短路径:n");
- to_vex(M,endv);
- }
- }
- //菜单
- void nemu()
- {
- system("cls");
- printf("1.输出顶点信息:n"); //输入你要进行的操作的序号
- printf("2.输出边的信息:n");
- printf("3.修改某条路径:n");
- printf("4.删除某一条边:n");
- printf("5.两地最短的路径:n");
- printf("6.到某地最短路径:n");
- printf("7.退出n");
- printf("++++++++++++++++++>>>>n");
- }