当前位置: 首页 > news >正文

【一本通】虫洞

【一本通】虫洞

  • C语言代码
  • C++代码
  • JAVA代码


💐The Begin💐点点关注,收藏不迷路💐

John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有M条小路(无向边)连接着N (从1…N标号)块地,并有W个虫洞(有向边)。其中1<=N<=500,1<=M<=2500,1<=W<=200。 现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗。 John将向你提供F(1<=F<=5)个农场的地图。没有小路会耗费你超过10000秒的时间,当然也没有虫洞回帮你回到超过10000秒以前。

输入

第1行: 一个整数 F, 表示农场个数。

每个农场的第1行:三个整数 N, M, W。

每个农场的第2…M + 1行:三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条用时T秒的小路。

每个农场的M + 2…M + W + 1行: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条可以使John到达T秒前的虫洞。

输出

第1至F行: 如果John能在这个农场实现他的目标,输出"YES",否则输出"NO"。

样例输入

2
3 3 1
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8

样例输出

NO
YES

C语言代码

#include <stdio.h>
#include <stdlib.h>

#define INF 0x3f3f3f3f
#define MAXN 500 + 5

// 边结构体,存储边的起点、终点和权重(时间花费,虫洞时为负权重)
typedef struct Edge {
    int from;
    int to;
    int weight;
} Edge;

// Bellman-Ford算法判断是否存在负权环(存在负权环则能回到过去)
int bellmanFord(int n, Edge edges[], int edgeCount) {
    int dist[MAXN];
    for (int i = 1; i <= n; ++i) {
        dist[i] = INF;
    }
    dist[1] = 0;

    for (int i = 1; i <= n; ++i) {
        int updated = 0;
        for (int j = 0; j < edgeCount; ++j) {
            if (dist[edges[j].to] > dist[edges[j].from] + edges[j].weight) {
                dist[edges[j].to] = dist[edges[j].from] + edges[j].weight;
                updated = 1;
            }
        }
        if (!updated) {
            return 0;
        }
    }
    return 1;
}

int main() {
    int F;
    scanf(“%d”, &F);
    while (F–) {
        int N, M, W;
        scanf(“%d %d %d”, &N, &M, &W);

        Edge* edges = (Edge*)malloc((2  M + W)  sizeof(Edge));
        int edgeIndex = 0;
        // 读入无向边(小路)信息,转换为两条有向边存入edges
        for (int i = 0; i < M; ++i) {
            int S, E, T;
            scanf(“%d %d %d”, &S, &E, &T);
            edges[edgeIndex++] = (Edge){S, E, T};
            edges[edgeIndex++] = (Edge){E, S, T};
        }
        // 读入有向边(虫洞)信息,存入edges
        for (int i = 0; i < W; ++i) {
            int S, E, T;
            scanf(“%d %d %d”, &S, &E, &T);
            edges[edgeIndex++] = (Edge){S, E, -T};
        }

        int canGoBack = bellmanFord(N, edges, edgeIndex);
        printf(“%s\n”, canGoBack? “YES” : “NO”);

        free(edges);
    }
    return 0;
}

C++代码

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

const int INF = 0x3f3f3f3f;  // 定义一个很大的值,用于初始化距离等情况
const int MAXN = 500 + 5;    // 节点数量上限,题目给定范围加一些余量

// 边结构体,用于存储边的起点、终点和权重(时间花费,虫洞时为负权重)
struct Edge {
    int from;
    int to;
    int weight;
};

// 使用Bellman-Ford算法判断是否存在负权环(存在负权环则能回到过去)
bool bellmanFord(int n, vector& edges) {
    vector dist(n + 1, INF);  // 存储从源点到各节点的距离,初始化为很大值
    dist[1] = 0;  // 可以任意设置一个起始点距离为0,因为要检测整个图是否有负环

    for (int i = 1; i <= n; ++i) {  // 进行n次迭代(理论上n - 1次就够,但多一次可检测负权环)
        bool updated = false;  // 标记本轮是否有距离更新
        for (Edge edge : edges) {  // 遍历所有边
            if (dist[edge.to] > dist[edge.from] + edge.weight) {  // 尝试松弛操作
                dist[edge.to] = dist[edge.from] + edge.weight;
                updated = true;
            }
        }
        if (!updated) {  // 如果本轮没有距离更新,说明已经收敛,不存在负权环,提前退出
            return false;
        }
    }
    return true;  // 如果完成n次迭代后仍能更新距离,说明存在负权环,即能回到过去
}

int main() {
    int F;
    cin >> F;  // 读入农场个数
    while (F–) {  // 对每个农场进行处理
        int N, M, W;
        cin >> N >> M >> W;  // 读入该农场的节点数、无向边(小路)数量、有向边(虫洞)数量

        vector edges;  // 存储该农场的所有边信息
        // 读入无向边(小路)信息,将其转换为两条有向边存入edges
        for (int i = 0; i < M; ++i) {
            int S, E, T;
            cin >> S >> E >> T;
            edges.push_back({S, E, T});
            edges.push_back({E, S, T});
        }
        // 读入有向边(虫洞)信息,存入edges
        for (int i = 0; i < W; ++i) {
            int S, E, T;
            cin >> S >> E >> T;
            edges.push_back({S, E, -T});  // 虫洞权重为负,表示回到过去,时间减少
        }

        bool canGoBack = bellmanFord(N, edges);  // 判断该农场是否能回到过去
        cout << (canGoBack? “YES” : “NO”) << endl;  // 根据结果输出相应字符串
    }
    return 0;
}

JAVA代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Edge {
    int from;  // 边的起点
    int to;    // 边的终点
    int weight; // 边的权重(时间花费,虫洞时为负权重)

    public Edge(int from, int to, int weight) {
        this.from = from;
        this.to = to;
        this.weight = weight;
    }
}

public class Main {
    private static final int INF = 0x3f3f3f3f;  // 定义一个很大的值,用于初始化距离等情况
    private static final int MAXN = 500 + 5;    // 节点数量上限,题目给定范围加一些余量

    // 使用Bellman-Ford算法判断是否存在负权环(存在负权环则能回到过去)
    private static boolean bellmanFord(int n, List edges) {
        int[] dist = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            dist[i] = INF;
        }
        dist[1] = 0;

        for (int i = 1; i <= n; i++) {  // 进行n次迭代(理论上n - 1次就够,但多一次可检测负权环)
            boolean updated = false;  // 标记本轮是否有距离更新
            for (Edge edge : edges) {  // 遍历所有边
                if (dist[edge.to] > dist[edge.from] + edge.weight) {  // 尝试松弛操作
                    dist[edge.to] = dist[edge.from] + edge.weight;
                    updated = true;
                }
            }
            if (!updated) {  // 如果本轮没有距离更新,说明已经收敛,不存在负权环,提前退出
                return false;
            }
        }
        return true;  // 如果完成n次迭代后仍能更新距离,说明存在负权环,即能回到过去
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int F = scanner.nextInt();  // 读入农场个数

        for (int f = 0; f < F; f++) {  // 对每个农场进行处理
            int N = scanner.nextInt();  // 读入该农场的节点数
            int M = scanner.nextInt();  // 读入该农场的无向边(小路)数量
            int W = scanner.nextInt();  // 读入该农场的有向边(虫洞)数量

            List edges = new ArrayList<>();
            // 读入无向边(小路)信息,将其转换为两条有向边存入edges
            for (int i = 0; i < M; i++) {
                int S = scanner.nextInt();
                int E = scanner.nextInt();
                int T = scanner.nextInt();
                edges.add(new Edge(S, E, T));
                edges.add(new Edge(E, S, T));
            }
            // 读入有向边(虫洞)信息,存入edges
            for (int i = 0; i < W; i++) {
                int S = scanner.nextInt();
                int E = scanner.nextInt();
                int T = scanner.nextInt();
                edges.add(new Edge(S, E, -T));  // 虫洞权重为负,表示回到过去,时间减少
            }

            boolean canGoBack = bellmanFord(N, edges);  // 判断该农场是否能回到过去
            System.out.println(canGoBack? “YES” : “NO”);  // 根据结果输出相应字符串
        }
        scanner.close();
    }
}

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

相关文章:

【一本通】虫洞

【一本通】虫洞 C语言代码C代码JAVA代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边&#xff0c;并可以使你返回到过去的一个时刻&#xff08;相对你进入虫洞之…...

python爬虫--小白篇【爬虫实践】

一、前言 1.1、王者荣耀皮肤爬虫 根据王者荣耀链接&#xff0c;将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤&#xff1a; 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id&#xff1b;根据单个英雄的hero_name和h…...

Unity背包道具拖拽(极简版实现)

&#xff08;感觉Csdn代码页面可以再大一点或者加个放大功能 不然得划着看不太舒服&#xff09; 1.关键接口&#xff0c;三个拖拽相关的 2.关键参数&#xff0c;PointerEventData 一直没仔细看过&#xff0c;其实有包含鼠标相关的很多参数&#xff0c;鼠标点击次数&#xff…...

spark读取普通文件

spark读取普通文件 txt文件 """ 将一行数据当做一个字段&#xff0c;需要自己切割 字段名称为value 表结构 可以从sql中搞 """ df spark.read.text("../../data/wordcount/input/data.txt") df spark.read.format("text"…...

MySQL SQL语句性能优化

MySQL SQL语句性能优化指南 一、查询设计优化1. 避免 SELECT *2. 使用 WHERE 进行条件过滤3. 避免在索引列上使用函数和表达式4. 使用 LIMIT 限制返回行数5. 避免使用子查询6. 优化 JOIN 操作7. 避免全表扫描 二、索引优化1. 使用合适的索引2. 覆盖索引3. 索引选择性4. 多列索引…...

【蓝桥杯每日一题】技能升级

技能升级 2024-12-10 蓝桥杯每日一题 技能升级 二分 题目大意 一个角色有 N 种可以增加攻击力的技能&#xff0c;对于第 i 个技能首次升级可以提升 A i A_i Ai​ 点攻击力&#xff0c;随后的每次升级增加的攻击力都会减少 B i B_i Bi​ 。升级 ⌈ A i B i ⌉ \lceil \frac{A…...

css 实现在一条线上流动小物体(offset-path)

直接贴代码,留几个参考网址给大家 【SVG】路径<Path>标签详解,一次搞懂所有命令参数 探秘神奇的运动路径动画 Motion Path <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport&quo…...

探索 Robyn 框架 —— 下一代高性能 Web 框架

技术博客&#xff1a;探索 Robyn 框架 —— 下一代高性能 Web 框架 什么是 Robyn&#xff1f; Robyn 是一个用 Rust 编写的高性能 Web 框架&#xff0c;旨在通过极简设计和高效并发处理&#xff0c;帮助开发者快速构建可扩展的现代 Web 应用。得益于 Rust 的内存安全性和性能…...

STL容器-map P3613【深基15.例2】寄包柜 普及-

题目来源&#xff1a;洛谷题库 文章目录 map例题map知识点map使用注意&#xff1a;map的常用用法 map例题 P3613【深基15.例2】寄包柜 普及- 题意 根据数据插入/查询 思路 map键值对可以根据柜子编号查找物品&#xff0c;但是柜子又有很多个&#xff0c;考虑数组或者map数组…...

【MySQL 进阶之路】了解 性能优化 与 设计原则

1.B树的优势 “矮胖”结构&#xff1a; 矮&#xff1a;B树的每个节点存储更多的关键字&#xff0c;从而减少了树的层级&#xff08;最多三层&#xff09;&#xff0c;减少了磁盘I/O操作&#xff0c;提高了查询效率。胖&#xff1a;叶子节点存储实际的数据&#xff0c;并使用双…...

MySQL之数据库三大范式

一、什么是范式&#xff1f; 范式是数据库遵循设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 &#xff08;范式是具有最小冗余的表结构&#xff09; 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式&#xff08;1NF/2NF/3NF…...

[大数据]Hudi

G:\Bigdata\17.hudi\大数据技术之数据湖Hudi 第1章 Hudi概述 1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服…...

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Dock…...

JavaScript 高级特性与 ES6 新特性:正则表达式的深度探索

在现代 JavaScript 开发中&#xff0c;正则表达式&#xff08;Regular Expressions&#xff09;和高级特性、ES6 新特性的结合使用&#xff0c;能够极大地提升代码的简洁性、可读性和功能性。本文将深入探讨 JavaScript 中的正则表达式及其在高级特性和 ES6 新特性中的应用&…...

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景&#x1f388;1.1. 模式匹配&#x1f388;1.2. 文本替换&#x1f388;1.3. 数据验证&#x1f388;1.4. 信息提取&#x1f388;1.5. 拆分字符串&#x1f388;1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…...

【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )

文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…...

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务&#xff0c;然而&#xff0c;纯OCR任务偏向于模型的感知能力&#xff0c;对于文档场景&#xff0c;由于文字密度较高&#xff0c;现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…...

Mybatis动态sql执行过程

动态SQL的执行原理主要涉及到在运行时根据条件动态地生成SQL语句&#xff0c;然后将其发送给数据库执行。以下是动态SQL执行原理的详细解释&#xff1a; 一、接收参数 动态SQL首先会根据用户的输入或系统的条件接收参数。这些参数可以是查询条件、更新数据等&#xff0c;它们…...

leetcode 31 Next Permutation

题意 找到下一个permutation是什么&#xff0c;对于一个数组[1&#xff0c;2&#xff0c;3]&#xff0c;下一个排列就是[1, 3, 2] 链接 https://leetcode.com/problems/next-permutation/ 思考 首先任何一个permutation满足一个性质&#xff0c;从某个位置往后一定是降序。…...

每日一练 | 华为 eSight 创建的缺省角色

01 真题题目 下列选项中&#xff0c;不属于华为 eSight 创建的缺省角色的是&#xff1a; A. Administrator B. Monitor C. Operator D. End-User 02 真题答案 D 03 答案解析 华为 eSight 是一款综合性的网络管理平台&#xff0c;提供了多种管理和监控功能。 为了确保不同用…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...