【一本通】虫洞

news2024/12/14 16:28:45

【一本通】虫洞

  • 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💐点点关注,收藏不迷路💐

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux之条件变量,信号量,生产者消费者模型

Linux之条件变量&#xff0c;信号量&#xff0c;生产消费者模型&#xff0c;日志以及线程池 一.条件变量1.1条件变量的概念1.2条件变量的接口 二.信号量2.1信号量的重新认识2.2信号量的接口 三.生产者消费者模型3.1生产者消费者模型的概念3.2基于阻塞队列的生产者消费者模型3.3…

如何写出优秀的单元测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 写出优秀的单元测试需要考虑以下几个方面&#xff1a; 1. 测试用例设计 测试用例应该覆盖被测试代码的不同场景和边界情况&#xff0c;以尽可能发现潜在的问题。…

【竞技宝】LOL:JDG官宣yagao离队

北京时间2024年12月13日,在英雄联盟S14全球总决赛结束之后,各大赛区都已经进入了休赛期,目前休赛期也快进入尾声,LPL大部分队伍都开始陆续官宣转会期的动向,其中JDG就在近期正式官宣中单选手yagao离队,而后者大概率将直接选择退役。 近日,JDG战队在官方微博上连续发布阵容变动消…

2024美赛数学建模C题:网球比赛中的动量,用马尔可夫链求解!详细分析

文末获取历年美赛数学建模论文&#xff0c;交流思路模型 接下来讲解马尔可夫链在2024年C题中的运用 1. 马尔科夫链的基本原理 马尔科夫链是描述随机过程的一种数学模型&#xff0c;其核心特征是无记忆性。 简单来说&#xff0c;系统在某一时刻的状态只取决于当前状态&#x…

图形学笔记 - 5. 光线追踪 - RayTracing

Whitted-Style Ray tracing 为什么要光线追踪 光栅化不能很好地处理全局效果 软阴影尤其是当光线反射不止一次的时候 栅格化速度很快&#xff0c;但质量相对较低 光线追踪是准确的&#xff0c;但速度很慢 光栅化&#xff1a;实时&#xff0c;光线追踪&#xff1a;离线~10K …

Nginx之配置防盗链(Configuring Anti-hotlinking in Nginx)

运维小白入门——Nginx配置防盗 什么是防盗链&#xff1a; 防盗链技术主要用于防止未经授权的第三方或域名访问网站的静态资源。例如&#xff0c;一个网站可能拥有独特的图片素材&#xff0c;为了防止其他网站通过直接链接图片URL的方式访问这些图片&#xff0c;网站管理员会采…

51c大模型~合集89

我自己的原文哦~ https://blog.51cto.com/whaosoft/12815167 #OpenAI很会营销 而号称超强AI营销的灵感岛实测成效如何&#xff1f; OpenAI 是懂营销的&#xff0c;连续 12 天发布&#xff0c;每天一个新花样&#xff0c;如今刚过一半&#xff0c;热度依旧不减。 毫无疑问&…

深度学习的unfold操作

unfold&#xff08;展开&#xff09;是深度学习框架中常见的数据操作。与我们熟悉的卷积类似&#xff0c;unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动&#xff0c;不同的是&#xff0c;卷积是滑动后与核求乘积&#xff08;所以取名为卷积&#xff09;&#…

Jetpack Compose赋能:以速破局,高效打造非凡应用

Android Compose 是谷歌推出的一种现代化 UI 框架&#xff0c;基于 Kotlin 编程语言&#xff0c;旨在简化和加速 Android 应用开发。它以声明式编程为核心&#xff0c;与传统的 View 系统相比&#xff0c;Compose 提供了更直观、更简洁的开发体验。以下是对 Android Compose 的…

Dual-Write Problem 双写问题(微服务)

原文链接https://www.confluent.io/blog/dual-write-problem/ 双写问题发生于当两个外部系统必须以原子的方式更新时。 问题 说有人到银行存了一笔钱&#xff0c;触发 DepositFunds 命令&#xff0c;DepositFunds 命令被发送到Account microservice。 Account microservice需…

桥接模式的理解和实践

桥接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;又称桥梁模式&#xff0c;是一种结构型设计模式。它的核心思想是将抽象部分与实现部分分离&#xff0c;使它们可以独立地进行变化&#xff0c;从而提高系统的灵活性和可扩展性。本文将详细介绍桥接模式的概念、原理…

kubeadm安装K8s集群之高可用组件keepalived+nginx及kubeadm部署

系列文章目录 1.kubeadm安装K8s集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 3.kubeadm安装K8s集群之master节点加入 4.kubeadm安装K8s集群之worker1节点加入 kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 1.安装kubeadm…

Avalonia实战实例三:实现可输入框的ComboBox控件

文章目录 一、Avalonia中的ComboBox控件二、更改Template&#xff0c;并添加水印 接着上篇关闭按钮实现登录界面 实现一个可输入&#xff0c;可下拉的用户名输入框 一、Avalonia中的ComboBox控件 Avalonia中Fluent主题里ComboBox实现&#xff1a; <ControlTheme x:Key&q…

TMS320C55x DSP芯片结构和CPU外围电路

第2章 DSP芯片结构和CPU外围电路 文章目录 第2章 DSP芯片结构和CPU外围电路TMS320C55x处理器的特点TMS320c55x CPU单元指令缓冲(Instruction Buffer Unit) I单元程序流程(Program Flow Unit) P单元地址数据(Address-data Flow Unit) A单元数据计算(Data Computation Unit) D单元…

Oracle 与 达梦 数据库 对比

当尝试安装了达梦数据库后&#xff0c;发现达梦真的和Oracle数据库太像了&#xff0c;甚至很多语法都相同。 比如&#xff1a;Oracle登录数据库采用sqlplus&#xff0c;达梦采用disql。 比如查看数据视图&#xff1a;达梦和Oracle都有 v$instance、v$database、dba_users等&a…

数据结构之五:排序

void*类型的实现&#xff1a;排序&#xff08;void*类型&#xff09;-CSDN博客 一、插入排序 1、直接插入排序 思想&#xff1a;把待排序的数据逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 单趟&#x…

JavaWeb:JavaScript

学习 资源1 学习资源 2 黑马javaweb 1、引入方式 内部脚本&#xff1a; <script>内容</script> 外部脚本&#xff1a; <script src"js/test.js"></script> 2、基础语法 注释&#xff1a;// /* */ 结尾分号可有可无 大括号表示代码块 …

MySQL其五,索引详解,逻辑架构,SQL优化等概念

目录 一、索引 1、索引的概念 2、索引的优缺点 3、添加索引的原则 4、索引的分类 5、索引如何使用 6、存储过程讲解 7、测试索引的效率 7、索引的数据结构 8、覆盖索引&#xff08;SQL优化的点&#xff09; 9、最佳左前缀法则&#xff08;SQL优化的点&#xff09; 二…

考研数学【线性代数基础box(数二)】

本文是对数学二线性代数基础进行总结&#xff0c;一些及极其简单的被省略了&#xff0c;代数的概念稀碎&#xff0c;不如高数关联性高&#xff0c;所以本文仅供参考&#xff0c;做题请从中筛选&#xff01; 本文为初稿&#xff0c;后面会根据刷题和自己的理解继续更新 第一章…

全面解析租赁小程序的功能与优势

内容概要 租赁小程序正在逐渐改变人与物之间的互动方式。通过这些小程序&#xff0c;用户不仅可以轻松找到所需的租赁商品&#xff0c;还能够享受无缝的操作体验。为了给大家一个清晰的了解&#xff0c;下面我们将重点介绍几个核心功能。 建议&#xff1a;在选择租赁小程序时&…