1018 Public Bike Management

比较复杂的模拟题,Dijstra和dfs结合,注意记牢回溯算法框架:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define ipair pair<int,int>
int cmax,n,sp,m;
vector<vector<int>> pre;
vector<vector<ipair>> graph;
vector<int> num,dis,temp,res;
int minNeed=INT_MAX,minBack=INT_MAX;
// 每条最短路径模拟前向再反向
void dfs(int last){
    temp.push_back(last);
    if(last==0){
        int need=0,back=0;
        for(int i=temp.size()-1;i>=0;i--){
            int tid=temp[i];
            if(num[tid]>=0){
                back+=num[tid];
            }else{ //够不够补再分情况讨论
                if(back>=(-num[tid])){ //够补
                    back+=num[tid];
                }else{    //不够补,能分多少分多少
                    need+=(-num[tid]-back);
                    back=0;
                }
            }
        }
        // 根据题目这句话:Finally after another space, output the number of bikes that we must take back to PBMC after the condition of Sp is adjusted to perfect.
        if(minNeed>need){
            minNeed=need;
            minBack=back;
            res=temp;
        }else if(minNeed==need&&minBack>back){
            minBack=back;
            res=temp;
        }
    }
    for(int i=0;i<pre[last].size();i++){
        dfs(pre[last][i]);
    }
    temp.pop_back();
}

int main(){
    scanf("%d%d%d%d",&cmax,&n,&sp,&m);
    graph.resize(n+1);
    num.resize(n+1,0);
    pre.resize(n+1);
    dis.resize(n+1,INT_MAX);
    dis[0]=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&num[i]);
        num[i]-=(cmax/2);
    }
    for(int i=0;i<m;i++){
        int s,d,w;
        scanf("%d%d%d",&s,&d,&w);
        graph[s].push_back(make_pair(d,w));
        graph[d].push_back(make_pair(s,w));
    }
    priority_queue<ipair, vector<ipair>, greater<ipair>> pq;
    pq.push(make_pair(0,0)); //weight, point
    while(!pq.empty()){
        int u=pq.top().second;
        pq.pop();
        if(u==sp) break;
        for(auto& it:graph[u]){
            int v=it.first;
            int weight=it.second;
            if(dis[u]+weight<dis[v]){
                dis[v]=dis[u]+weight;
                pre[v].clear();
                pre[v].push_back(u);
                pq.push(make_pair(dis[v],v));
            }else if(dis[u]+weight==dis[v]){
                pre[v].push_back(u);
            }
        }
    }
    dfs(sp);
    printf("%d ",minNeed);
    for(int i=res.size()-1;i>=0;i--){
        printf(i==0?"%d":"%d->",res[i]);
    }
    printf(" %d",minBack);
}
相关推荐
黎阳之光1 天前
无感定位·智管全域:黎阳之光人员无感定位管理系统,重新定义安全与效率
人工智能·物联网·算法·安全·数字孪生
小许同学记录成长1 天前
网格简化算法 — Edge Collapse(边塌缩)
qt·算法
凯瑟琳.奥古斯特1 天前
力扣1001网格照明解法
算法·leetcode·职场和发展
fengenrong1 天前
20260601
算法·深度优先·图论
晚笙coding1 天前
从“看起来像双指针”到真正的动态规划 —— 最长公共子序列
算法·动态规划
05候补工程师1 天前
【考研高数核心突破】极限的本质、高频解题套路与海涅定理深度解析(附经典例题思维导图式拆解)
经验分享·笔记·考研·算法
智者知已应修善业1 天前
【51单片机8个LED的花样12亮34熄56间隔78闪烁3秒3闪烁】2023-11-4
c++·经验分享·笔记·算法·51单片机
老鱼说AI1 天前
统计学习方法第五章:从浅入深解析决策树
人工智能·深度学习·算法·决策树·机器学习·学习方法
KaMeidebaby1 天前
卡梅德生物技术快报|蛋白修饰调控 NETosis 分子机制及实验研究进展
前端·数据库·人工智能·算法·百度
初中就开始混世的大魔王1 天前
5 Fast DDS-Discovery
网络·c++·算法·中间件