首页 > 其他分享 >7-35 城市间紧急救援

7-35 城市间紧急救援

时间:2024-03-22 23:32:21浏览次数:21  
标签:dist 救援 int 救援队 城市 35 快速道路 紧急 sum

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。

第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:

第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例:

2 60
0 1 3

 

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int N = 510;
#define INF 0x3f3f3f3f
int g[N][N],w[N];
int dist[N],st[N];
int n,m,s,d;
int cnt[N],pre[N],sum[N];
void dijkstra()
{
    memset(dist,0x3f,sizeof dist);
    dist[s] = 0;
    cnt[s] = 1;
    sum[s] = w[s];
    for(int i=0;i<n;i++)
    {
        int t = -1;
        for(int j=0;j<n;j++)
        {
            if(!st[j]&&(t==-1||dist[j]<dist[t])) t=j;
        }
        st[t] = true;
        for(int j=0;j<n;j++)
        {
            if(dist[t] + g[t][j] < dist[j])
            {
                dist[j] = dist[t] + g[t][j];
                cnt[j] = cnt[t];
                sum[j] = sum[t] + w[j];
                pre[j] = t;
            }
            else if(dist[t] + g[t][j] == dist[j])
            {
                cnt[j] += cnt[t];
                if(sum[t] + w[j] > sum[j])
                {
                    sum[j] = sum[t] + w[j];
                    pre[j] = t;
                }
            }
        }
    }
}
int main()
{
    memset(g,0x3f,sizeof g);
    cin>>n>>m>>s>>d;
    for(int i=0;i<n;i++) cin>>w[i];
    while(m--)
    {
        int u,v,w;
        cin>>u>>v>>w;
        g[u][v] = g[v][u] = min(g[u][v],w);
    }
    dijkstra();
    vector<int> temp;
    for(int i=d;i!=s;i = pre[i]) temp.push_back(i);
    cout<<cnt[d]<<" "<<sum[d]<<endl;
    cout<<s;
    for(int i=temp.size()-1;i>=0;i--) cout<<" "<<temp[i];
    return 0;
}

标签:dist,救援,int,救援队,城市,35,快速道路,紧急,sum
From: https://blog.csdn.net/qq_62145422/article/details/136820812

相关文章

  • Codeforces Round 935 (Div. 3)
    A-SettingupCamp思路:判断c能否填充b让b为3的倍数查看代码voidsolve(){inta,b,c;cin>>a>>b>>c;intans=a+b/3;b%=3;if(b>0&&b+c<3)cout<<-1<<'\n';else{ans+=(b+c+2)/3;c......
  • 海思 SS927V100 HI3519AV200 简介
    海思SS927V100HI3519AV200简介HI3519AV200是一颗专业ultra-HDSmartIPCameraSOC。SS927V100(另称:22AP70、SD3402)功能以及封装与HI3519AV200完全一致,可以平替HI3519AV200。最高支持四路sensor输入,支持最高4K60的ISP图像处理能力,支持3FWDR、多级降噪、六轴......
  • 【RedHat】重启服务器进入了emergency mode紧急状态——UUID不匹配
    启动redhat系统时出现emergencymode,处于紧急模式。并提示可以在登录root用户输入root用户密码后,通过journalctl-xb查看系统日志;systemctlreboot重启系统;systemctldefault或者exit进入默认模式。进入紧急模式的通常原因有两种:一种是/etc/fstab文件开机自动挂载的......
  • RK356x Linux解包update.img、打包update.img和win环境下烧写固件
    1.解包update.imgstep1将afptool、rkImageMaker、unpack.sh拷贝在~/work/test下topeet@ubuntu:~/work/test$lsafptooloutputrkImageMakerunpack.shupdate.imgstep2执行./unpack.sh,后会生成output文件夹topeet@ubuntu:~/work/test$./unpack.sh......
  • LeetCodeHot100 二分查找 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查
    35.搜索插入位置https://leetcode.cn/problems/search-insert-position/description/?envType=study-plan-v2&envId=top-100-likedpublicintsearchInsert(int[]nums,inttarget){intleft=0;intright=nums.length-1;while(left<......
  • cfRound935div3--DEFG题解
    ps:这场因为精神状态不佳,又C题题意有点绕,卡题了,头晕找不到错.最后做了两题就溜了.狠狠扣90分..D-SeraphimtheOwl题意:即选一个位置,使得其满足题意。而且在满足题意的基础上,要靠近中心越好,如果满足题意而且靠近中心的距离一样,那么输出前面那个.intcnt0[300005]={0};......
  • 代码随想录算法训练营第五十三天| ● 1143.最长公共子序列 ● 1035.不相交的线 ●
    最长公共子序列 题目链接:1143.最长公共子序列-力扣(LeetCode)思路:。classSolution{public:intlongestCommonSubsequence(stringtext1,stringtext2){vector<vector<int>>dp(text1.size()+1,vector<int>(text2.size()+1,0));for(inti......
  • Codeforces Round 935 (Div. 3)
    A.SettingupCamp#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;voidsolve(){inta,b,c;cin>>a>>b>>c;intres=a+b/3;b%=3;if(b!=0){if(c<3-b){......
  • 代码随想录算法训练营第五十三天 | 53. 最大子序和 动态规划,1035.不相交的线,1143.最
    53.最大子数组和 已解答中等 相关标签相关企业 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。  示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]......
  • knife4j/swagger救援第一现场
    1、前方来报,测试环境springboot项目无法启动,现场如下:ErrorstartingApplicationContext.Todisplaytheauto-configurationreportre-runyourapplicationwith'debug'enabled.[ERROR]2024-03-2012:54:42,718--main--[org.springframework.boot.diagnostics.Logging......