7-9 旅游规划 (25 分)

本文回顾了Dijkstra算法的学习过程,通过一个具体的题目实践,详细介绍了如何使用Dijkstra算法计算两点之间的最短路径,包括初始化结构体、更新距离和成本的过程。文章还分享了作者在大学运动会结束时的个人感想。

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

题目链接

//这个题跟个板题差不多,跌死啦算法,暑假第一周学过,当时学的挺明白的,现在就都忘了,又重新看了看网课,不错,稍微看一点就行了,DIj用来计算两个点的最短路径,就是不断找最短的路,然后一次次的更新就行了。哎

怎么都忘了 。。 

这个题我弄了个结构体就来存路长和过路费,然后跟板子一样。

还有今天大学的运动会结束了,应该是人生最后一次参加运动会了(尽管这次没有报项目),我觉得应该记录一下,尽管这两天非常无聊,还掉了一小块牙,但这是最后一次,值得写一下。

#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 0x3f3f3f3f
using namespace std;
struct node{
    int dst;
    int cost;
    node():dst(INF),cost(INF) {
    }
};
int N,M,S,D;
node mp[510][510];
node dis[510];
int book[510];
void dij(int s,int e){
    dis[s].cost=0;
    dis[s].dst=0;
    int i,j;
    for(int i=0;i<N;i++){
        int minw=INF;
        int minv;
        int minc=INF;
        for(j=0;j<N;j++){
            if(book[j]) continue;
            if(dis[j].dst<minw){
                minv=j;
                minc=dis[j].cost;
                minw=dis[j].dst;
            }
            else if(dis[j].dst==minw){
                if(dis[j].cost<minc){
                    minv=j;
                    minc=dis[j].cost;
                    minw=dis[j].dst;
                }
            }
        }
        //cout<<minv<<minc<<minw<<endl;
        book[minv]=1;
        if(minv==e) break;
        for(j=0;j<N;j++){
            if(book[j] || !mp[minv][j].dst)
                continue;
            if(dis[j].dst>dis[minv].dst+mp[minv][j].dst){
                dis[j].dst=dis[minv].dst+mp[minv][j].dst;
                dis[j].cost=dis[minv].cost+mp[minv][j].cost;
            }
            else if(dis[j].dst==dis[minv].dst+mp[minv][j].dst){
                if(dis[j].cost > dis[minv].cost+mp[minv][j].cost){
                dis[j].dst=dis[minv].dst+mp[minv][j].dst;
                dis[j].cost=dis[minv].cost+mp[minv][j].cost;
                }
            }
        }
    }
    cout<<dis[e].dst<<" "<<dis[e].cost<<endl;
}
int main(){
    int a,b,c,d;
    memset(dis,INF,sizeof(dis));
    memset(book,0,sizeof(book));
    memset(mp,INF,sizeof(mp));
    scanf("%d%d%d%d",&N,&M,&S,&D);  //S是出发地 D是目的地  N是城市个数 M是公路条数
    for(int i=1;i<=M;i++){
        cin>>a>>b>>c>>d;
        if(c>mp[a][b].dst ||  d>mp[a][b].cost) continue;
        mp[a][b].dst=c;
        mp[b][a].dst=c;
        mp[a][b].cost=d;
        mp[b][a].cost=d;
    }
    dij(S,D);

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值