The Shortest Path in Nya Graph(神一样的建图)

西门子S7-200 SMART PLC高速计数器与增量式编码器实战配置指南 在工业自动化控制系统中,传感器是将物理量转换为电信号的关键组件,其中编码器作为核心的位置与速度检测元件,其工作原理基于光电或磁电效应,将机械位移转换为脉冲序列。增量式编码器通过输出相位差90度的A/B两相脉冲,不仅能实现精确的位移测量,还能通过相位关系自动判别运动方向,并通过倍频技术提升分辨率。其技术价值在于为PLC等控制器提供了实时、高精度的位置反馈,是实现闭环控制、提升系统精度与可靠性的基础。在包装机械、物料输送、绕线设备等应用场景中,编码器与PLC高速计数器的协同工作是实现精确定位、定长切割与速度控制 阅读详情

Description
This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of this paragraph, just move on.
The Nya graph is an undirected graph with “layers”. Each node in the graph belongs to a layer, there are N nodes in total.
You can move from any node in layer x to any node in layer x + 1, with cost C, since the roads are bi-directional, moving from layer x + 1 to layer x is also allowed with the same cost.
Besides, there are M extra edges, each connecting a pair of node u and v, with cost w.
Help us calculate the shortest path from node 1 to node N.

Input
The first line has a number T (T <= 20) , indicating the number of test cases.
For each test case, first line has three numbers N, M (0 <= N, M <= 10 5) and C(1 <= C <= 10 3), which is the number of nodes, the number of extra edges and cost of moving between adjacent layers.
The second line has N numbers l i (1 <= l i <= N), which is the layer of i th node belong to.
Then come N lines each with 3 numbers, u, v (1 <= u, v < =N, u <> v) and w (1 <= w <= 10 4), which means there is an extra edge, connecting a pair of node u and v, with cost w.

Output
For test case X, output “Case #X: ” first, then output the minimum cost moving from node 1 to node N.
If there are no solutions, output -1.

Sample Input
2
3 3 3
1 3 2
1 2 1
2 3 1
1 3 3

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

Sample Output
Case #1: 2
Case #2: 3
F**K

每个点都属于一个层数,相邻层是可以互相移动的,点之间也是有边相连的,现在求1到n的最短路。
如果只用n个点就炸了!这样建图边的数量太多了。(每个层不止一个点)
然后机智的分出n各点,代表层数,然后点连向对应的层,但是还是容易炸。
所以就再出n个点,一个代表入度,一个代表出度,然后就是建图了。
add_edge(n + 2*i - 1,n + 2*(i + 1),c,cnt++);
add_edge(n + 2*(i + 1) - 1,n + 2*i,c,cnt++);这个需要自己画图理解一下。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
int head[300050],d[300050],n;
bool leap[300050];
struct Node
{
    int u,v,w,next;
}node[600050];
void add_edge(int u,int v,int w,int tot)
{
    node[tot].u = u;node[tot].v = v;
    node[tot].w = w;
    node[tot].next = head[u];
    head[u] = tot;
}
void spfa()
{
    for(int i = 1;i <= 3*n;i++)leap[i] = false;
    for(int i = 1;i <= 3*n;i++)d[i] = inf;
    d[1] = 0;leap[1] = true;
    deque<int>p;
    p.push_back(1);
    while(p.size())
    {
        int u = p.front();p.pop_front();
        leap[u] = false;
        for(int i = head[u];i != -1;i = node[i].next)
        {
            int v = node[i].v;
            if(d[v] > d[u] + node[i].w)
            {
                d[v] = d[u] + node[i].w;
                if(!leap[v])
                {
                    leap[v] = true;
                    if(p.size()&&d[v] < d[p.front()])
                    {
                        p.push_front(v);
                    }
                    else
                        p.push_back(v);
                }
            }
        }
    }
}
int main()
{
    #ifdef LOCAL
    freopen("C:\\Users\\ΡΡ\\Desktop\\in.txt","r",stdin);
    //freopen("C:\\Users\\ΡΡ\\Desktop\\out.txt","w",stdout);
    #endif // LOCAL
    int t,kase = 1;
    scanf("%d",&t);
    while(t--)
    {
        int m,c;
        int cnt = 1;
        scanf("%d%d%d",&n,&m,&c);
        memset(head,-1,sizeof(head));
        for(int i = 1;i <= n;i++)
        {
            int x;scanf("%d",&x);
            add_edge(i,n + 2*x - 1,0,cnt++);
            add_edge(n + 2*x,i,0,cnt++);
        }
        for(int i = 1;i < n;i++)
        {
            add_edge(n + 2*i - 1,n + 2*(i + 1),c,cnt++);
            add_edge(n + 2*(i + 1) - 1,n + 2*i,c,cnt++);
        }
        for(int i = 1;i <= m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add_edge(u,v,w,cnt++);
            add_edge(v,u,w,cnt++);
        }
        spfa();
        if(d[n] == inf || n == 0)
            printf("Case #%d: %d\n",kase++,-1);
        else
            printf("Case #%d: %d\n",kase++,d[n]);
    }
    return 0;
}

2*n个点也是可以过得,就是建图优化一下,点直接连到相邻层,不连到自己那层,可以减少边的个数,然后就过了……莫名A。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
int head[300050],d[300050],n,ran[100050];
bool leap[300050],vis[100050];
struct Node
{
    int u,v,w,next;
}node[600050];
void add_edge(int u,int v,int w,int tot)
{
    node[tot].u = u;node[tot].v = v;
    node[tot].w = w;
    node[tot].next = head[u];
    head[u] = tot;
}
void spfa()
{
    for(int i = 1;i <= 2*n;i++)leap[i] = false;
    for(int i = 1;i <= 2*n;i++)d[i] = inf;
    d[1] = 0;leap[1] = true;
    queue<int>p;
    p.push(1);
    while(p.size())
    {
        int u = p.front();p.pop();
        leap[u] = false;
        for(int i = head[u];i != -1;i = node[i].next)
        {
            int v = node[i].v;
            if(d[v] > d[u] + node[i].w)
            {
                d[v] = d[u] + node[i].w;
                if(!leap[v])
                {
                    leap[v] = true;
                    p.push(v);
                }
            }
        }
    }
}
int main()
{
    #ifdef LOCAL
    freopen("C:\\Users\\ΡΡ\\Desktop\\in.txt","r",stdin);
    //freopen("C:\\Users\\ΡΡ\\Desktop\\out.txt","w",stdout);
    #endif // LOCAL
    int t,kase = 1;
    scanf("%d",&t);
    while(t--)
    {
        int m,c;
        int cnt = 1;
        scanf("%d%d%d",&n,&m,&c);
        memset(head,-1,sizeof(head));
        memset(vis,false,sizeof(vis));
        for(int i = 1;i <= n;i++)
        {
            scanf("%d",&ran[i]);
            vis[ran[i]] = 1;
        }
        for(int i = 1;i < n;i++)
        {
            if(vis[i]&&vis[i + 1])
            {
                add_edge(n + i,n + i + 1,c,cnt++);
                add_edge(n + i + 1,n + i,c,cnt++);
            }
        }
        for(int i = 1;i <= n;i++)
        {
            add_edge(n + ran[i],i,0,cnt++);
            if(ran[i] > 1)add_edge(i,n + ran[i] - 1,c,cnt++);
            if(ran[i] < n)add_edge(i,n + ran[i] + 1,c,cnt++);
        }
        for(int i = 1;i <= m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add_edge(u,v,w,cnt++);
            add_edge(v,u,w,cnt++);
        }
        spfa();
        if(d[n] == inf || n == 0)
            printf("Case #%d: %d\n",kase++,-1);
        else
            printf("Case #%d: %d\n",kase++,d[n]);
    }
    return 0;
}

网上还有说法是对spfa“优化”一下,其实根本不是优化,只是因为这个图边特别多,采用了近似dij的思想,把入队的位置改变了一下,这题卡spfa,还是老实用dij稳定一些。就不写在这里了。

毕设加分项!手把手教你完成基于YOLOv8与PyQt5的多类别目标检测系统——让你的毕设从“完成”到“出色” 从KITTI数据集处理,到YOLOv8模型训练,再到PyQt5界面开发,整个流程其实没有想象中那么难。只要你跟着步骤一步步来,不仅能顺利完成毕设,还能掌握目标检测和GUI开发的核心技能——这些技能在未来的求职、读研中都非常实用。如果过程中遇到问题,别担心!可以去YOLOv8的官方文档、PyQt5论坛找答案,也可以和同学、老师交流。记住,完成毕设的过程也是你技术成长的过程,坚持下去,你会为自己的成果感到自豪。 阅读详情

相关推荐

STM32 HAL库下DHT22高精度温湿度采集与30秒定时实现

单总线传感器(如DHT22)是嵌入式环境监测系统的核心数据源,其通信依赖微秒级精确时序控制。在STM32平台中,需结合硬件定时器(如TIM2)构建稳定周期触发机制,并通过GPIO+精确延时(非HAL_Delay)完成协议解析。该方案突破整数读取局限,完整还原带一位小数的温度与湿度值,显著提升工业级数据精度。典型应用于物联网终端、智能农业节点及边缘侧环境监控系统,为MQTT/CoAP等协议上报提供结构化原始数据支撑。本实践基于STM32F103与HAL库,不依赖第三方驱动,具备强可移植性与工程鲁棒性。

weixin_42453228的博客 513

HDU - 4725 The Shortest Path in Nya Graph(增点建图)(图文详解)(超易理解)

The Shortest Path in Nya Graph HDU - 4725增点建图 Dijkstra 邻接表 problem This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco ...

四季不败的博客 584

Linux与Windows双系统,安装完linux后无法通过grub进入Windows的解决方法

先装Windows 10,Windows可正常启动,再装Kali,Kali提示装grub后照装。然而装完后重启发现无Windows选项。

sakurashockwave的博客 6453

The Shortest Path in Nya Graph

hdu4725:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:给你一张无向图,然后这些点会分在不同的层中,相邻的层的任意两点之间的距离是c。然后还有一些额外边,有相应的边权,现在求1--n的最短距离。 题解:如果直接建图的话,会发现边的数量实在是太多了。所以这样朴素的建图方式肯定不行。于是,要加入一些点。怎么加呢?每一层加入两个点,,第i层...

weixin_30295091的博客 143

NVIDIA DGX Spark (Ubuntu 24.04) 部署Isaac Sim与Isaac Lab:二进制安装与ROS2集成实战

本文详细介绍了在NVIDIA DGX Spark工作站(Ubuntu 24.04系统)上,通过预编译二进制包稳定部署Isaac Sim与Isaac Lab的完整实战流程。文章重点剖析了二进制安装相较于源码编译和pip安装的优势,有效规避了CUDA、PyTorch等关键组件的版本冲突陷阱,并逐步指导完成环境配置、Isaac Lab集成、Conda环境管理以及ROS2 Jazzy的集成,最终构建出完整的机器人仿真与强化学习开发平台。

kite3的博客 396

【数据库】银行/信贷业务测试工作中涉及的数据库表格

银行/信贷业务测试工作中涉及的数据库表格,金融信贷测试人必看!

孤之鹜的博客 1169

P - The Shortest Path in Nya Graph HDU - 4725

P - The Shortest Path in Nya Graph HDU - 4725 最短路 不是 每两个点之间按层数设置边权 + 额外边权 TLE 是 相邻两层之间设置边权 + 额外边权 需注意 add 添加得是点的关系而不是层得关系 以下加边得方法 TLE 了,应该是因为太多重复加边, 如 2 1-2 2-1 ; 1 1-2 map<int, int> mp; scanf("%d%d%d", &N, &M, &C); for(in

一只养生的程序猿。 137

最新Linux CSI Tools安装教程(两台主机,一发一收)(监控模式)

无线感知之CSI Tools工具安装,最新在监控模式下采集CSI数据,

h1998040218的博客 3028

HDU - 4725The Shortest Path in Nya Graph

This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of this paragraph, just m

dreambyday 315

刚体转动欧拉方程:从理论到卫星姿态控制的实践

刚体转动欧拉方程是描述刚体旋转运动的基本动力学方程,在卫星姿态控制、机器人学、航空航天等领域有着广泛应用。本文将详细讲解欧拉方程的物理概念、数学推导、数值计算方法,并重点分析其在卫星姿态控制系统中的具体应用。

ScilogyHunter的博客 641

基于Simulink的PR(比例谐振)控制器在单相整流中的应用

本文详细介绍了基于Simulink的单相整流系统中PR(比例谐振)控制器的设计与实现方法。首先阐述了PR控制器相较于传统PI控制器的优势,能够有效消除交流信号跟踪中的稳态误差。接着系统讲解了PR控制器的传递函数原理、实用型设计(带带宽)及参数整定方法。通过Simulink建模步骤,包括主功率电路搭建、电压外环PI设计、电流指令生成、PR控制器实现(推荐MATLAB Function方法)和SPWM调制等关键环节。仿真对比显示PR控制在电流跟踪精度(THD仅1.9%)、功率因数(0.998)和动态响应(突变恢

amy_mhd的博客 689

hdu4725 The Shortest Path in Nya Graph (层节点建图+最短路)

问题描述 这是一个非常简单的问题,你的任务是计算el camino mas corto en un grafico,然后单独计算cambiar un poco el algoritmo。如果你对这段话一个字都不懂,那就继续读下去。 Nya图是一个具有“层”的无向图。图中的每个节点都属于一个层,总共有N个节点。 你可以从x层的任意节点移动到x + 1层的任意节点,花费C,因为道路是双向的,所以从x ...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 358

CAD二次开发c# .net加载cui\cuix菜单文件

public static void LoadMyCui(string cuiFile) { Document doc = Application.DocumentManager.MdiActiveDocument; object oldCmdEcho = Application.GetSystemVariable("CMDECHO"); object oldFileDia = Application.GetSys..

2126

【详解】The Shortest Path in Nya Graph HDU - 4725 ⭐⭐⭐⭐ 【层级加点建图】

The Shortest Path in Nya Graph HDU - 4725 This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not ...

Suprit's blog 1195

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

HDU - 4725 The Shortest Path in Nya Graph (技巧建图)

The Shortest Path in Nya Graph This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand...

Error Man 的博客 375

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

hdu4725—The Shortest Path in Nya Graph(spfa+建图)

题目链接:传送门 The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6804    Accepted Submission(s): 1535 Prob

zhiyuanjiang的博客 315

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

hdu4725 The Shortest Path in Nya Graph(dijkstra+建图)

The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16403 Accepted Submission(s): 3423 Problem Description This i...

weixin_43736492的博客 440

HDU4725 - The Shortest Path in Nya Graph (Dijstra + 建图)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725题目大意:现在有N个节点,编号从1到N。有M条权值为Ci无向边,链接着两个节点。 新加入了一个条件,每个节点在一个层内,假设在 x 层,那么在 x 层内的节点可以直接到达 x + 1 层或 x -1 层的任意节点,花费为 C 。现在求从 1 到 N 的最短路。解题过程:比赛的时候没做出来,现在才

ACM_Fish的博客 750

HDU - 4725 The Shortest Path in Nya Graph 最短路,思维建图

题目链接 HDU-4725 题意 给定n个点m个带权双向道路,这n个点各自有一个叫层级的属性。相邻层级间的点可以通过花费c转移。求1-n最短路。 思路 这题可能是kuangbin这个专题里难度数一数二的了。思路很清晰,裸的最短路,难点在于建图。这个建图又和POJ - 2502里专门恶心人的建图不一样,是真的需要动脑子的。 关于层级,虽然层级范围是1-n,但没有告诉你一定是1-n全出现,也没有告诉你一个层级只有一个点。这意味着: 离线处理变得困难 只能连接相邻的两层,比如不加处理直接连接1-3层级,如果2层

TheSunspot的博客 795

The Shortest Path in Nya Graph虚点建边

The Shortest Path in Nya Graph 虚点建边 题意:给出N个点,除了给出的M条无向边外,他们每个点位于第Li层楼,第Li层楼上的可以到它上面一层上的点或者下面一层的点,距离为C,Li<=N<=1e5 如果你把每个点都存到vector里面,vector[i]里面记录第i层上的点,然后两个for语句暴力连点就是N^2复杂度,最坏的情况就是第一层楼有1e5/2个点,...

想要一只银渐层 251

HDU - 4725 The Shortest Path in Nya Graph(最短路)好题好题

上题: This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of this paragra

wjmwsgj的博客 568

HDU 4725 The Shortest Path in Nya Graph

This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of this paragraph, just...

Minun 340

The Shortest Path in Nya Graph(图论,最短路,建图)

建图难点,完成建图后=模板题

weixin_43925900的博客 355

HDU 4725 The Shortest Path in Nya Graph 【dijkstra+堆+分层建图】

HDU 4725 The Shortest Path in Nya Graph 题目链接:vjudge传送门 题目大意: 给定n个点(编号1到n),以及每个点处于的层数(1到n),一个点有一条边通向上/下相邻层的所有点的边,权值为c,另外有额外m条边,记录n个点中任意两点之间带权的边,问从1点出发到n点的最短距离。 具体思路: 处于相邻层的不同层上的点都有一条权值为c的双向边,因此可以每两层中的各...

指弹键盘哼民谣 659

hdu_4725 The Shortest Path in Nya Graph(单源最短路)

The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description This is a very easy problem, your task is just calculate el ca...

sigh_的博客 207

最短路dijkstra—The Shortest Path in Nya Graph(HDU - 4725)

题目链接:>_> 题目:The Shortest Path in Nya Graph This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you ...

Darge. 271
上一篇: Extended Traffic(spfa判负环)
下一篇: 0 or 1(最短路转化)
Techay
博客等级 码龄11年 11粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值