【PAT甲级】1175 Professional Ability Test

问题思考:

  1. 首先,若所有的计划(plan)中的节点都可达,则输出 Okay否则输出 Impossible。注意:这里的“plan”判断的是整个图(这里是有向图)上的节点,而不只是那K个queries节点。若存在环,则必然在经历一趟拓扑排序之后,还有留存节点未能遍历到,即判断环内有节点不可达。
  2. 其次,每个query对应输出最佳plan,要求S(score )最少的基础上多争取D(voucher)。这里的麻烦在于,如何化成一个单源最短路问题(这里显然可能存在多个 i 节点是没有前置要求的,即“You may take test i directly”的,即“多源”的最短路)?—— 一个技巧性的做法就是,额外设置一个起点(与所有 i 节点直接相连),并求该点到整个图上的节点的单源最短路问题。
  3. 并用一个Last数组在每选出一条最短路边的时候记录上个节点,用来到时候追溯回去,一直追溯到预设的起点。因为该起点和所有的 i 节点直接相连,所以,求所有 i 节点到query节点的最短路中的最短路,等价于求该起点到queiry节点的最短路。
  4. 若先输出Okay,则之后根据Last数组输出each query节点的最短路
  5. 若先输出Impossible,之后只需判断query是否直接可达无需前置要求,否则输出Error。

代码实现:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, m, k, in[1005], in2[1005], f, last[1005];
struct node {
    int v, score, voucher;
    bool operator < (const node &x) const {
        if (score != x.score) return score > x.score;
        return voucher < x.voucher; 
    }
};
struct edge {
    int next, s, d;
};
vector<edge> E[1005]; // 邻接表的简洁表示
queue<int> que;
vector<pair<int, int>> dis(1002, {2e9, -1});
bool circle() {
    vector<int> S;
    while (que.size()) {
        int now = que.front();
        que.pop();
        S.push_back(now);
        for (auto x : E[now]) {
            in2[x.next]--;
            if (!in2[x.next]) que.push(x.next);
        }
    }
    return S.size() == n;
}
void dijkstra() {
    vector<int> vis(1005);
    priority_queue<node> Q;
    Q.push({1002, 0, 0});
    while (Q.size()) {
        node now = Q.top();
        Q.pop();
        if (vis[now.v]) continue;
        vis[now.v] = 1;
        dis[now.v].first = now.score;
        dis[now.v].second = now.voucher;
        for (auto x : E[now.v]) {
            if (vis[x.next]) continue;
            if (dis[x.next].first > dis[now.v].first + x.s || 
            ((dis[x.next].first == dis[now.v].first + x.s) 
            && (dis[x.next].second < dis[now.v].second + x.d))) {
                dis[x.next].first = dis[now.v].first + x.s;
                dis[x.next].second = dis[now.v].second + x.d;
                last[x.next] = now.v;
                Q.push({x.next, dis[x.next].first, dis[x.next].second});
            }
        }
    }
    return ;
}
int main() {
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int a, b, s, d;
        scanf("%d%d%d%d", &a, &b, &s, &d);
        // 构建邻接表
        E[a].push_back(edge{b, s, d});
        in[b]++, in2[b]++;
    }
    // 寻找无前置要求的节点
    for (int i = 0; i < n; i++) {
        if (in[i] == 0) {
            E[1002].push_back({i, 0, 0}); // 起点与无前置要求的节点相连
            que.push(i);
        }
    }
    f = circle();
    dijkstra();
    cin >> k;
    if (f) cout << "Okay.\n";
    else cout << "Impossible.\n";
    for (int i = 0, q; i < k; i++) {
        scanf("%d", &q);
        if (!in[q]) cout << "You may take test " << q << " directly.\n";
        else if (!f) cout << "Error.\n";
        else {
            vector<int> path;
            while (q != 1002) {
                path.push_back(q);
                q = last[q];
            }
            for (int j = path.size() - 1; j >= 0; j--) {
                cout << path[j];
                j && cout << "->";
            }
            cout << '\n';
        }
    }
    return 0;
}

知识点:小于号重载

  • 这里需要注意,重载小于号的方向,下面是一个实验样例。
#include<iostream>
#include<vector>
#include<queue>
struct node {
    int v, score, voucher;
    bool operator < (const node &x) const {
        if (score != x.score) return score > x.score;
        return voucher < x.voucher; 
    }
};
int main() {
    priority_queue<node> que;
    que.push(node{0, 1, 2});
    que.push(node{1, 1, 3});
    que.push(node{2, 2, 2});
    while (que.size()) {
        node now = que.top(); que.pop();
        cout << "now : " << now.v << " " << now.score << " " << now.voucher << endl;
    }
    return 0;
}
  • 运行结果: 
now : 1 1 3
now : 0 1 2
now : 2 2 2

可见如果想要让自定义结构满足按其某个property从小到大排序,就得这么写:

bool operator < (const node &x) const {
    return this.property > x.property
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/325956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java SSM框架实现学生寝室管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现学生寝室管理系统演示 摘要 寝室管理设计是高校为学生提供第二课堂&#xff0c;而我们所在学院多采用半手工管理学生寝室的方式&#xff0c;所以有必要开发寝室管理系统来对进行数字化管理。既可减轻学院宿舍长工作压力&#xff0c;比较系统地对宿舍通告…

如何将千亿文件放进一个文件系统,EuroSys‘23 CFS 论文背后的故事

1. 引言 本文的主要目的是解读百度沧海存储团队发表于 EuroSys 2023 的论文《CFS: Scaling Metadata Service for Distributed File System via Pruned Scope of Critical Sections》&#xff0c;论文全文可以在 CFS: Scaling Metadata Service for Distributed File System v…

存内计算技术打破常规算力局限性

目录 前言 关于存内计算 1、常规算力局限性 2、存内计算诞生记 3、存内计算核心 存内计算芯片研发历程及商业化 1、存内计算芯片研发历程 2、存内计算先驱出道 3、存内计算商业化落地 基于知存科技存内计算开发板ZT1的降噪验证 &#xff08;一&#xff09;任务目标以…

Linux上新部署的项目jar包没有生效

今天公司新安排了一个项目&#xff0c;这里简称项目A&#xff0c;需要新增两个功能&#xff0c;我这边完成之后&#xff0c;跟前端对接好了&#xff0c;调试也没有问题。 然后把项目打包上传到测试服务器上&#xff0c;重新启动项目&#xff0c;发现项目A新增的接口没有生效&a…

QT属性动画

时间记录&#xff1a;2024/1/15 一、介绍 属性动画类为QPropertyAnimation&#xff0c;类似于CSS的keyframes关键帧 二、分类及使用步骤 1.几何动画 &#xff08;1&#xff09;创建QPropertyAnimation对象 &#xff08;2&#xff09;setPropertyName方法设置属性名称&#…

MetaGPT入门(二)

接着MetaGPT入门&#xff08;一&#xff09;&#xff0c;在文件里再添加一个role类 class SimpleCoder(Role):def __init__(self,name:str"Alice",profile:str"SimpleCoder",**kwargs):super().__init__(name,profile,**kwargs)self._init_actions([Write…

【设计模式-3.3】结构型——享元模式

说明&#xff1a;说明&#xff1a;本文介绍设计模式中结构型设计模式中的&#xff0c;享元模式&#xff1b; 游戏地图 在一些闯关类的游戏&#xff0c;如超级玛丽、坦克大战里面&#xff0c;游戏的背景每一个关卡都不相同&#xff0c;但仔细观察可以发现&#xff0c;其都是用…

第十五讲_css水平垂直居中的技巧

css水平垂直居中的技巧 1. 水平垂直居中&#xff08;场景一&#xff09;2. 水平垂直居中&#xff08;场景二&#xff09;3. 水平垂直居中&#xff08;场景三&#xff09;4. 水平垂直居中&#xff08;场景四&#xff09; 1. 水平垂直居中&#xff08;场景一&#xff09; 条件&a…

Python UI框架库之kivy使用详解

概要 Python是一种广泛使用的编程语言&#xff0c;而Kivy是一个用于创建跨平台移动应用和多点触控应用的开源Python框架。Kivy的设计目标是提供一种简单而强大的方式来构建富有创意的用户界面和交互体验。本文将详细介绍Kivy的基本概念、核心特性、布局系统、用户界面设计和实…

【服务器数据恢复】服务器迁移数据时lun数据丢失的数据恢复案例

服务器数据恢复环境&服务器故障&#xff1a; 一台安装Windows操作系统的服务器。工作人员在迁移该服务器中数据时突然无法读取数据&#xff0c;服务器管理界面出现报错。经过检查发现服务器中一个lun的数据丢失。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有磁盘…

macOS 13(本机)golang程序交叉编译成 ARM架构

## 背景 golang程序&#xff08;JuiceFS&#xff09;需要支持ARM64架构&#xff0c;重新编译&#xff1b; 本地环境&#xff1a;macOS&#xff1a;13 ## 操作 安装交叉编译工具&#xff1a; brew install FiloSottile/musl-cross/musl-cross --with-aarch64 可以在 /usr/l…

【MATLAB随笔】遗传算法优化的BP神经网络(随笔,不是很详细)

文章目录 一、算法思想1.1 BP神经网络1.2 遗传算法1.3 遗传算法优化的BP神经网络 二、代码解读2.1 数据预处理2.2 GABP2.3 部分函数说明 一、算法思想 1.1 BP神经网络 BP神经网络&#xff08;Backpropagation Neural Network&#xff0c;反向传播神经网络&#xff09;是一种监…

【Unity】【Pico】【VR开发】为何PICO打包后真机运行闪退

【背景】 设置步骤&#xff0c;项目配置都没问题&#xff0c;Build也成功&#xff0c;Unity版本是符合要求的2022LTS版本&#xff0c;但是一在真机上运行就闪退。 【分析】 由于并没有开版权验证&#xff0c;而且闪退后也并没有弹框说版权问题&#xff0c;所以还是怀疑环境有…

如何有效构建进攻性的网络安全防护策略

文章目录 前言一、进攻性安全策略的价值&#xff08;一&#xff09;进攻性安全和防御性安全的区别&#xff08;二&#xff09;进攻性安全带来一种新的测试和防御的方法&#xff08;三&#xff09;进攻性安全策略也比防御性安全策略更具前瞻性 二、进攻性安全策略的类型&#xf…

欠拟合与过拟合

欠拟合&#xff1a; 模型在训练集上表现不好&#xff0c;在测试集上也表现不好。模型过于简单 欠拟合在训练集和测试集上的误差都较大 通过代码展示欠拟合 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from skle…

【基于 InternLM 和 LangChain 搭建你的知识库】学习笔记

学习参考文档【基于 InternLM 和 LangChain 搭建你的知识库】 学习参考链接【书生・浦语大模型实战营第三课作业(基础进阶)】 理论 实战 收集原始数据 收集2018年-2020年几年间的优秀数学建模论文 修改脚本文件&#xff0c;测试文件 作业 复现课程知识库助手搭建过程 La…

直接在引导文件或引导U盘上洗白(适用于新装)

准备工作 方案适用于,在原机器上使用PE引导修改、U盘引导/SATA引导(引导盘可拆到其它机器上操作)、虚拟机制作镜像制作前期 所需软件 DiskGenius、读写镜像文件 ChipEasy_芯片无忧、ChipGenius 是读取u盘PID VID用的。 Notepad2(好用的编辑工具,可用来改PID和VID) …

基于 Level set 方法的医学图像分割

摘 要 医学图像分割是计算机辅助诊断系统设计中的关键技术。对于医学图像分割问题,它一般可分为两部分:(l)图像中特定目标区域(器官或组织)的识别;(2)目标区域完整性的描述与提取。相比于其他图像,医学图像的复杂性和多样性,使得传统的基于底层图像信息的分割方法很难取得好的…

win10系统postgresql重装软件后原数据如何迁移

1、备份postgresql安装目录下的data文件夹 2、重新安装postgresql同一版本的软件 3、停止postgresql-x64-12服务 4、替换data文件夹 删除postgresql安装后新的的data文件夹 删除后将第一步备份的data文件夹粘贴过来&#xff0c;还是同一位置 5、启动postgresql-x64-12服务 …

微信接入知识库定制化的AI会怎样?

想不想要一个更加了解你的chatgpt&#xff1f;或者想给chatgpt加入特定的知识库&#xff1f; LinkAI来帮你&#xff01; 通过LinkAI&#xff0c;无需openai的api key&#xff0c;直接使用chatgpt。无需考虑服务器代理配置&#xff0c;openai账号注册等&#xff01;自定义知识…