PAT甲级1003 Emergency (25分)

该博客介绍了如何运用Dijkstra算法解决一个结合最短路径和最大召集人数的问题。作者首先设置边界条件,然后通过经典的Dijkstra算法遍历地图,更新每个节点的最短路径和可召集的最大人数。博客中提到了易失分点,如忘记跳出条件和INT_MAX的使用。代码已通过所有测试用例。

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

(第一时间思路)
原题:在这里插入图片描述
思路:
1.首先想到的是单源最短路径djs求解
2.然后需要保存最短路的条数和所能号召的人数
3.最后感觉比较类似dp
源代码:

#include<iostream>
using namespace std;
#define INT_MAX 0xfffffff
int map[505][505];		//地图
int N, M, C1, C2;		//N城镇数,M道路数,C1我的位置,C2遇险城镇
int peoplenum[505];		//每个城镇的人数
int minlennum[505];		//到每个城镇的最短路的个数
int maxnum[505];		//到每个城镇最大可召集的人数
int vis[505];			//访问标志
int tmp[505];			//最短路长度
int main(){
    cin>>N>>M>>C1>>C2;
    for(int i = 0; i < N; i ++){
        cin>>peoplenum[i];
        vis[i] = 0;
        minlennum[i] = 0;
        tmp[i] = INT_MAX;
    }
    for(int i = 0; i < M; i ++){
        int x, y, w;
        cin>>x>>y>>w;
        map[x][y] = w;
        map[y][x] = w;
    }
    tmp[C1] = 0;		//边界条件
    minlennum[C1] = 1;	//边界条件
    maxnum[C1] = peoplenum[C1];//边界条件
    for(int i = 0; i < N; i ++){		//经典djs
        int minlen = INT_MAX;
        int u = -1;
        for(int j = 0; j < N; j ++){
            if(!vis[j] && tmp[j] < minlen){
                minlen = tmp[j];
                u = j;
            }
        }
        if(u == -1)  break;		//跳出条件
        vis[u] = 1;
        for(int v = 0; v < N; v ++){
            if(!vis[v] && map[u][v] != 0){
                if(tmp[u] + map[u][v] < tmp[v]){
                    tmp[v] = tmp[u] + map[u][v];
                    minlennum[v] = minlennum[u];//对路条数的改动
                    maxnum[v] = maxnum[u] + peoplenum[v];
                }else if(tmp[u] + map[u][v] == tmp[v]){//对路条数的改动
                    minlennum[v] += minlennum[u];
                    if(maxnum[u] + peoplenum[v] > maxnum[v])
                        maxnum[v] = maxnum[u] + peoplenum[v];
                }
                
            }
        }
    }
    cout<<minlennum[C2]<<" "<<maxnum[C2];
}

已AC:在这里插入图片描述

易失分点:
1.忘记添加跳出条件
2.pat的编译器不能直接用INT_MAX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值