dijkstra和floyd简单实现

今天给大家带来的是利用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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li_jeremy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值