最短路

最短路问题顾名思义,就是求一个点到另一个点的最短路径。先来介绍一种简单的算法,它只有5行,但是因为用了三层for循环,所以容易超时,但是处理较小数据还是一个挺不错的算法。
首先将给出的路径初始化并赋值:

    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if(i==j)
            e[i][j]=0;
        else
            e[i][j]=9999999;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        e[x][y]=z;
    }

接下来就是代码的核心:

        for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        if(e[i][j]>e[i][k]+e[k][j])
        e[i][j]=e[i][k]+e[k][j];

如果遇到比较大的输入这种算法就会超时,接下来介绍一种较大数据也不会超时的算法,dijk算法。
跟上一个一样,先赋值:

    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if(i==j)
            e[i][j]=0;
        else
            e[i][j]=9999999;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        e[x][y]=z;
    }

我们计算一下1号点到各个点的距离
初始化一下dis数组和book数组:

    for(int i=1;i<=n;i++)
        dis[i]=e[1][i];
    memset(book,0,sizoef(book));
    book[1]=1;

接下来就是算法的核心:

    for(int i=1;i<=n-1;i++)
    {
        //寻找距离一号点最近的点
        int minn=9999999;
        int u;
        for(int j=1;j<=n;j++)
        {
            if(book[j]==0&&dis[j]<minn)
            {
                minn=dis[j];
                u=j;
            }
            book[u]=1;
            for(int j=1;j<=n;j++)
            {
                if(e[u][j]<9999999)
                {
                    if(dis[j]>dis[u]+e[u][j])
                        dis[j]=dis[u]+e[u][j];
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值