#include <stdio.h>
#include <string.h>
int n,m;
int s[100][100];
int Dijkstra(int start,int end)
{
int i,j,k;
int min;
int dis[100000];
int book[100];
memset(dis,0,sizeof(dis));
memset(book,0,sizeof(book));
for (i=0;i<n;i++)
dis[i]=s[start][i];
for (i=1;i<=n-1;i++)
{
min=99999;
for (j=0;j<n;j++)
if ((dis[j]<min)&&(!book[j]))
{
k=j;
min=dis[j];
}
book[k]=1;
for (j=0;j<n;j++)
if (dis[j]>dis[k]+s[k][j])
dis[j]=dis[k]+s[k][j];
}
return dis[end]-1;
}
int main()
{
int i,j,a,b,ans,ok;
memset(s,0,sizeof(s));
printf("请输入城市数量\n");
while(scanf("%d",&n)==1&&n<0)
{
printf("输入错误,请输入正确的城市数量\n");
}
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (i==j)
s[i][j]=0;
else
s[i][j]=99999;
printf("请输入公交线路数量\n");
while(scanf("%d",&m)==1&&m<0)
{
printf("输入错误,请输入正确的公交路线数量\n");
}
ok=1;
for (i=0;i<m;i++)
{
if (ok)
printf("请输入可达的两个站台\n");
scanf("%d%d",&a,&b);
ok=1;
if ((a<0)||(a>=n)||(b<0)||(b>=n)||(a==b))
{
printf("请输入正确的站台编号\n");
ok=0;
i--;
}
else
s[a][b]=1;
}
printf("请输入起点和终点\n");
while(scanf("%d%d",&a,&b)==2&&((a<0)||(a>=n)||(b<0)||(b>=n)))
{
printf("请输入正确的起点和终点\n");
}
ans=Dijkstra(a,b);
if (ans==99998)
printf("无法到达\n");
else
if (ans)
printf("最少换乘次数为%d\n",ans);
else
printf("不需要换乘\n");
return 0;
}
飞机最少换乘(迪杰斯特拉实验)
最新推荐文章于 2023-04-07 23:32:13 发布