杨腾泽
yangtengze 1 year ago
parent 31b3c58caf
commit 37e048dfca

@ -28,9 +28,6 @@ void adddian(MatGrath &G); //增加城市的信息
void modify(MatGrath &G); //修改城市信息
int display(MatGrath &G);//输出所有城市信息
void danyuan(MatGrath &G,int d); //求两点之间的最短路径
int Ppath2(MatGrath &G,int path[],int i,int v);
int main()
{
int a; //case语句的选择
@ -48,7 +45,6 @@ int main()
printf(" ■ ■欢迎使用城市公路导航系统■ ■ \n");
printf(" ■ ■■■■■■■■■■■■■■■■ ■ \n");
printf("\n");
printf(" 编号 城市名称\n");
printf(" 1 济南市\n");
printf(" 2 德州市\n");
@ -137,20 +133,15 @@ int main()
display(G);
break;
case 6:
scanf("%d",&d);
danyuan(G,d);
break;
case 7:
scanf("%d",&m);
DFS(G,m);
break;
case 8:
case 7:
scanf("%d",&y);
scanf("%d",&x);
delet(G,y,x);
break;
case 9:
case 8:
printf("欢迎使用,再见!\n");
exit(0);
break;

@ -19,14 +19,13 @@
printf(" ┃ 3.修改城市信息 ┃\n");
printf(" ┃ 4.增加城市信息 ┃\n");
printf(" ┃ 5.输出所有城市信息 ┃\n");
printf(" ┃ 6.输出单源路径 ┃\n");
printf(" ┃ 7.DFS遍历输出 ┃\n");
printf(" ┃ 8.删除节点 ┃\n");
printf(" ┃ 9.退出系统 ┃\n");
printf(" ┃ 6.DFS遍历输出 ┃\n");
printf(" ┃ 7.删除节点 ┃\n");
printf(" ┃ 8.退出系统 ┃\n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━┛\n");
printf(" 请输入您的选择\n");
scanf("%d",&c);
if(c==1||c==2||c==3||c==4||c==5||c==6||c==7||c==8||c==9)
if(c==1||c==2||c==3||c==4||c==5||c==6||c==7||c==8)
flag=0;
} while(flag);
return c;

@ -72,62 +72,3 @@ void ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径
***********************/
//Dijkstra算法求单源路径
int Ppath2(MatGrath &G,int path[],int i,int v) //前向递归查找路径上的顶点
{
int k;
k=path[i];
if (k==v) return k; //找到了起点则返回
Ppath2(G,path,k,v); //找顶点k的前一个顶点
printf("%s->",G.vexs[k].sight);//输出顶点k
}
void danyuan(MatGrath &G,int v)//求两点之间的最短路径
{
int dist[MAXV],path[MAXV];
int s[MAXV];
int mindis,i,j,u;
for (i=1; i<=G.vexnum; i++)
{
dist[i]=G.arc[v][i].length; //距离初始化
s[i]=0; //s[]置空
if (G.arc[v][i].length<INF) //路径初始化
path[i]=v;
else
path[i]=-1;
}
s[v]=1;
path[v]=0; //源点编号v放入s中
for (i=1; i<=G.vexnum; i++) //循环直到所有顶点的最短路径都求出
{
mindis=INF; //mindis置最小长度初值
for (j=1; j<=G.vexnum; j++) //选取不在s中且具有最小距离的顶点u
if (s[j]==0 && dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
s[u]=1; //顶点u加入s中
for (j=1; j<=G.vexnum; j++) //修改不在s中的顶点的距离
if (s[j]==0)
if (G.arc[u][j].length<INF && dist[u]+G.arc[u][j].length<dist[j])
{
dist[j]=dist[u]+G.arc[u][j].length;
path[j]=u;
}
}
for(i=1; i<=G.vexnum; i++)
if (s[i]==1&&v!=i)
{
printf(" 从%s到%s的最短路径长度为:%d米\t路径为:",G.vexs[v].sight,G.vexs[i].sight,dist[i]);
printf("%s->",G.vexs[v].sight); //输出路径上的起点
Ppath2(G,path,i,v); //输出路径上的中间点
printf("%s\n",G.vexs[i].sight); //输出路径上的终点
}
}

Loading…
Cancel
Save