今天给大家带来的是利用dijkstra和floyd实现的城市之间的最短距离,功能单一主要是dilkstra和floyd的实现和输出,程序可以运行。
自己现在处于出击学习阶段,正在学习数据结构,大部分在书上找的,自己对原理不是特别的清楚,希望得到大家宝贵的意见。
dijkstra
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define FINITY 5000
#define m 20
typedef char datatype[m][20];
typedef int edgetype;
typedef enum{FALSE,TRUE} boolean;
typedef int dist[m];
typedef int path[m];
typedef struct{
datatype vex;
edgetype edges[m][m];
int n,e;
}Mgraph;
int change(Mgraph g,char *nam) //转换
{
int i;
for(i=0;i<g.n;i++)
if(strcmp(nam,g.vex[i])==0)return i;
return -1;
}
void pGraph(Mgraph *g)
{
int i,j,h,k;
char z,x;
printf("请输入城市个数和相互城市之间的道路:\n");
scanf("%d%d",&g->n,&g->e);
printf("----------------------------\n");
for(h=0;h<g->n;h++)
{
printf("请输入第%d个城市的信息:",h+1);
scanf("%s",g->vex[h]);
}
printf("----------------------------\n");
getchar(); //getchar()接受回车符号拉
for(i=0;i<g->n;i++) //邻接矩阵初始化
{
for(j=0;j<g->n;j++)
{
g->edges[i][j]=FINITY;
if(i==j)
{
g->edges[i][j]=0;
}
}
}
for(k=0;k<g->e;k++)
{
int i,j,w;
char p[20],q[20];
printf("请输入道路相通的两个城市以及两个城市之间的路程:");
scanf("%s %s %d",p,q,&w);
getchar();
i=change(*g,p);
j=change(*g,q);
g->edges[i][j]=w;
g->edges[j][i]=g->edges[i][j];
}
}
void dijkstra(Mgraph g,int v0,path p,dist d)
{
boolean final[m];//表示当前元素是否已经求出最短路径
int i,j,k,v,x,min;
//第一步:初始化集合s和距离向量d
for(v=0;v<g.n;v++)
{
final[v]=FALSE;
d[v]=g.edges[v0][v];
if(d[v]<FINITY && d[v]!=0)
p[v]=v0;
else
p[v]=-1;
}
final[v0]=TRUE;
d[v0]=0;
//第二步 依次找出n-1结点加入s中
for(i=1;i<g.n;i++)
{
min=FINITY;
for(k=0;k<g.n;k++)
{
if(!final[k] && d[k]<min)
{
v=k;
min=d[k];
}
}
printf("\n到达%s的最短距离为: %dkm\n",g.vex[v],min);
if(min==FINITY)
return ;
final[v]=TRUE;
//第三步 修改s与v-s中各节点的距离
for(k=0;k<g.n;k++)
if(!final[k] && (min+g.edges[v][k]<d[k]))
{
d[k]=min+g.edges[v][k];
p[k]=v;
}
}
}
//输出有向图的最短路径
void print_gpd(Mgraph g,path p,dist d)
{
int st[m],i,pre,top=-1; //定义st 初始化空栈
for(i=0;i<g.n;i++)
{
printf("\n到达%s的距离为: %4d ,路径为:",g.vex[i],d[i]);
st[++top]=i;
pre=p[i];
while(pre!=-1)
{
st[++top]=pre;
pre=p[pre];
}
while(top>0)
printf("%s--->",g.vex[st[top--]]);
}
}
int main()
{
Mgraph g;
path p;
dist d;
int v0;
char a[20];
pGraph(&g);
printf("---------------------------\n");
printf("请输入城市起点:");
scanf("%s",a);
v0=change(g,a);
printf("到各个城市的最短距离如下:\n");
dijkstra(g,v0,p,d);
print_gpd(g,p,d);
return 0;
}
floyd
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define FINITY 5000
#define m 20
typedef char datatype[m][20];
typedef int edgetype;
typedef int dist[m][m];
typedef int path[m][m];
typedef struct{
datatype vex;
edgetype edges[m][m];
int n,e;
}Mgraph;
int change(Mgraph g,char *nam) //转换
{
int i;
for(i=0;i<g.n;i++)
if(strcmp(nam,g.vex[i])==0)return i;
return -1;
}
void pGraph(Mgraph *g)
{
int i,j,h,k;
char z,x;
printf("请输入城市个数和相互城市之间的道路:\n");
scanf("%d%d",&g->n,&g->e);
printf("----------------------------\n");
for(h=0;h<g->n;h++)
{
printf("请输入第%d个城市的信息:",h+1);
scanf("%s",g->vex[h]);
}
printf("----------------------------\n");
getchar(); //getchar()接受回车符号拉
for(i=0;i<g->n;i++) //邻接矩阵初始化
{
for(j=0;j<g->n;j++)
{
g->edges[i][j]=FINITY;
if(i==j)
{
g->edges[i][j]=0;
}
}
}
for(k=0;k<g->e;k++)
{
int i,j,w;
char p[20],q[20];
printf("请输入道路相通的两个城市以及两个城市之间的路程:");
scanf("%s %s %d",p,q,&w);
getchar();
i=change(*g,p);
j=change(*g,q);
g->edges[i][j]=w;
g->edges[j][i]=g->edges[i][j];
}
}
void floyd(Mgraph g,path p,dist d)
{
int i,j,k;
for(i=0;i<g.n;i++)
{
for(j=0;j<g.n;j++)
{
d[i][j]=g.edges[i][j];
if(i!=j && d[i][j]<FINITY)
p[i][j]=i;
else
p[i][j]=-1;
}
}
for(k=0;k<g.n;k++)
{
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
if(d[i][j]>d[i][k]+d[k][j])
{
d[i][j]=d[i][k]+d[k][j];
p[i][j]=k;
}
}
}
//输出城市信息
void print_floyd(Mgraph g,path p,dist d)
{
int st[m],i,j,k,top;
for(i=0;i<g.n;i++)
{
top=0;
for(j=0;j<g.n;j++)
{
if(i==j)continue;
printf("%s到%s的最短路径为:",g.vex[i],g.vex[j]);
st[top++]=j;
k=p[i][j];
while(k!=i)
{
st[top++]=k;
k=p[i][k];
}
st[top]=i;
for(;top>0;top--)
printf("%s-->",g.vex[st[top]]);
printf("%s路径长度为:%d\n",g.vex[st[top]],d[i][j]);
printf("------------------------------------------------------\n");
}
}
}
int main()
{
Mgraph g;
path p;
dist d;
int v0;
char a[20];
pGraph(&g);
printf("---------------------------\n");
printf("所有的路径如下:\n");
floyd(g,p,d);
print_floyd(g,p,d);
return 0;
}