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

@ -28,9 +28,6 @@ void adddian(MatGrath &G); //增加城市的信息
void modify(MatGrath &G); //修改城市信息 void modify(MatGrath &G); //修改城市信息
int display(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 main()
{ {
int a; //case语句的选择 int a; //case语句的选择
@ -48,7 +45,6 @@ int main()
printf(" ■ ■欢迎使用城市公路导航系统■ ■ \n"); printf(" ■ ■欢迎使用城市公路导航系统■ ■ \n");
printf(" ■ ■■■■■■■■■■■■■■■■ ■ \n"); printf(" ■ ■■■■■■■■■■■■■■■■ ■ \n");
printf("\n"); printf("\n");
printf(" 编号 城市名称\n"); printf(" 编号 城市名称\n");
printf(" 1 济南市\n"); printf(" 1 济南市\n");
printf(" 2 德州市\n"); printf(" 2 德州市\n");
@ -137,20 +133,15 @@ int main()
display(G); display(G);
break; break;
case 6: case 6:
scanf("%d",&d);
danyuan(G,d);
break;
case 7:
scanf("%d",&m); scanf("%d",&m);
DFS(G,m); DFS(G,m);
break; break;
case 8: case 7:
scanf("%d",&y); scanf("%d",&y);
scanf("%d",&x); scanf("%d",&x);
delet(G,y,x); delet(G,y,x);
break; break;
case 9: case 8:
printf("欢迎使用,再见!\n"); printf("欢迎使用,再见!\n");
exit(0); exit(0);
break; break;

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

@ -71,63 +71,4 @@ void ShortestPath(MatGrath &G,int v,int w)//求两点之间的最短路径
Dijkstra Dijkstra
***********************/ ***********************/
//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