天天写算法之Bus System

本文介绍了一种基于Dijkstra算法解决最短路径问题的方法,并通过具体实例展示了如何使用该算法来计算不同节点间的最小费用。文章详细解释了算法的工作原理、初始化过程以及主要步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题目,我看了一下网上的,感觉没太看懂,于是按照正常的dj写了一遍

Map里存的是费用,也就是最后找什么最小那么咱们就存什么,等我复习回来的时候再用floyd做一遍。

代码如下,注意long long ,无论是输入还是输出,还有INF的最大值,因为是64位的,所以INF,取了1e18的大小

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
using namespace std;
#define MAX 1005
const long long INF = 1e18;
long long low[MAX];
long long  Map[MAX][MAX];
int flags[MAX];
long long dis[MAX];
long long L[5],C[5];
int num,n, m , from, target;
void  dijkstra(int start){

    memset(low,0,sizeof(low));
    memset(flags,0,sizeof(flags));

    for(int i = 1 ; i <= n ;i ++)
    {
        low[i]=Map[start][i];
    }
    flags[start]=1;
    int pos ;
    long long Ma;
    for(int i = 1 ; i <= n ; i ++)
    {
        Ma= INF;
        for(int j = 1 ; j <= n ; j++)
        {
            if(!flags[j]&&Ma>low[j])
            {
                Ma = low[j];
                pos = j ;
            }
        }
        if(Ma ==INF)
        {
            return ;
        }
        flags[pos]= 1 ;
        for(int j =1 ; j <=n ; j ++)
        {
            if(!flags[j]&&low[j]>Ma+Map[pos][j])
            {
                low[j] = Ma+Map[pos][j];
            }
        }

    }
}
int init(){
    for(int i = 1 ; i <= n ; i ++)//把每个点直接到其他点的花费都计算出来,超出的权威INF;
    {
        for(int j =1 ;j <=n ; j ++)
        {
            if(i==j)
                Map[i][j]=0;
            else {
                long long  temp = abs(dis[j]-dis[i]);
                if(temp<=L[1])
                {
                    Map[i][j]=Map[j][i]= C[1];
                }else if(temp>L[1]&&temp<=L[2])
                {
                    Map[i][j]=Map[j][i] =C[2];
                }else if(temp>L[2]&&temp<=L[3])
                {
                    Map[i][j]=Map[j][i] =C[3];
                }else if(temp>L[3]&&temp<=L[4])
                {
                    Map[i][j]=Map[j][i] =C[4];
                }else {
                    Map[i][j]=Map[j][i] =INF;
                }
            }
        }
    }
}
int main(){
    int index = 1 ;
    scanf("%Id",&num);
    while(num--)
    {
        for(int i= 1 ;i<5;i ++)
        {
            cin>>L[i];
        }
        for(int i= 1 ;i<5;i ++)
        {
            cin>>C[i];
        }
        scanf("%d%d",&n,&m);
        for(int i = 1 ; i<= n ;i++)
        {
            scanf("%I64d",&dis[i]);//第i个车站的位置dis[i]
        }
        init();
        printf("Case %d:\n",index++);
        while(m--)
        {
            scanf("%d%d",&from,&target);
            dijkstra(from);
            if(low[target]==INF)
            {
                printf("Station %d and station %d are not attainable.\n",from,target);
            }else
            printf("The minimum cost between station %d and station %d is %I64d.\n",from,target,low[target]);
        }

    }
    return 0 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值