codevs 1391 伊吹萃香

*ps:老实说我真不想调试这个程序(T ^ T)

go to the problem

题目描述 Description

在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的路,来方便进出。已知妖怪之山上有N个路口(编号1..N),每个路口都被萃香设置了一定质量白洞或者黑洞。原本在各个路口之间有M条单向路,走过每一条路需要消耗一定量的体力以及1个单位的时间。由于白洞和黑洞的存在,走过每条路需要消耗的体力也就产生了变化,假设一条道路两端路口黑白洞的质量差为delta:

  1. 从有白洞的路口走向有黑洞的路口,消耗的体力值减少delta,若该条路径消耗的体力值变为负数的话,取为0。

  2. 从有黑洞的路口走向有白洞的路口,消耗的体力值增加delta。

  3. 如果路口两端均为白洞或黑洞,消耗的体力值无变化。

由于光是放置黑洞白洞不足以体现萃香的强大,所以她决定每过1个单位时间,就把所有路口的白洞改成黑洞,黑洞改成白洞。当然在走的过程中你可以选择在一个路口上停留1个单位的时间,如果当前路口为白洞,则不消耗体力,否则消耗s[i]的体力。现在请你计算从路口1走到路口N最小的体力消耗。保证一定存在道路从路口1到路口N。

输入描述 Input Description

第1行:2个正整数N, M

第2行:N个整数,第i个数为0表示第i个路口开始时为白洞,1表示黑洞

第3行:N个整数,第i个数表示第i个路口设置的白洞或黑洞的质量w[i]

第4行:N个整数,第i个数表示在第i个路口停留消耗的体力s[i]

第5..M+4行:每行3个整数,u, v, k,表示在没有影响的情况下,从路口u走到路口v需要消耗k的体力。

输出描述 Output Description

第1行:1个整数,表示消耗的最小体力

样例输入 Sample Input
4 5

1 0 1 0

10 10 100 10

5 20 15 10

1 2 30

2 3 40

1 3 20

1 4 200

3 4 200

样例输出 Sample Output
130

数据范围及提示 Data Size & Hint

对于30%的数据:1 <= N <= 100, 1 <= M <= 500

对于60%的数据:1 <= N <= 1,000, 1 <= M <= 5,000

对于100%的数据:1 <= N <= 5,000, 1 <= M <= 30,000

其中20%的数据为1 <= N <= 3000的链

1 <= u,v <= N, 1 <= k,w[i],s[i] <= 200

按照1 -> 3 -> 4的路线。


可以看出是一个变化版的最短路,需要在跑SPFA时进行状态的维护。
开一个结构体记录一个点的编号和当前为白洞还是黑洞,更新时也分白洞和黑洞两种。

需要注意的地方有很多:

  1. 走过每一条路需要消耗一定量的体力以及1个单位的时间,因此如果一条路的终点是白洞,这条路消耗的体力值用白洞计算,而更新的是终点为黑洞时的最短路(走过去就变为了黑洞)。
  2. 不需要记走到i所花费的时间,每次只需要判断当前点的状态(黑洞还是白洞)与初始状态,如果不变,那终点也不变,如果变了,那终点也变了(每个时刻图中各点的变化是同步的)。
  3. 从有白洞的路口走向有黑洞的路口,消耗的体力值减少delta,若该条路径消耗的体力值变为负数的话,取为0。
  4. 每次更新时所用的队头元素要分停留与不停留两种情况进行讨论。

那么。。。
上代码吧?(o°ω°o)

代码_(:з」∠)_
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std;

int N,M,cnt;
int de[5010][2],used[5010][2],k[5010],w[5010],s[5010];
int first[5010],next[30010];
struct edge{
    int i,k;
}; 
struct maple{
    int f,t,d;
}Rode[30010];

queue<edge> q;
void SPFA()
{
    memset(de,63,sizeof(de));
    q.push((edge){1,1});
    q.push((edge){1,0});
    used[1][0]=1,used[1][1]=1;
    de[1][0]=0,de[1][1]=0;
    if(k[1]) de[1][0]=s[1];
    while(!q.empty())
    {
        edge a=q.front();
        q.pop();
        used[a.i][a.k]=0;
        for(int i=first[a.i];i;i=next[i])
        {
            int delta=w[Rode[i].t]-w[a.i],d=0,K=k[Rode[i].t];
            if(a.k!=k[a.i]) K=K^1; // 去反,不能用~   ~0=-1
            if(delta<0) delta*=-1;
            if(K!=a.k)
               if(!a.k) d=-1*delta;
               else d=delta;
            //不停留
            int D=Rode[i].d+d;
            if(D<0) D=0;
            if(de[Rode[i].t][K^1]>de[a.i][a.k]+D)
            {
                de[Rode[i].t][K^1]=de[a.i][a.k]+D;
                if(!used[Rode[i].t][K^1])
                {
                    used[Rode[i].t][K^1]=1;
                    q.push((edge){Rode[i].t,K^1});
                }
            }  
            //停留 
            D=Rode[i].d-d;
            if(D<0) D=0;
            if(a.k) D+=s[a.i];
            if(de[Rode[i].t][K]>de[a.i][a.k]+D)
            {
                de[Rode[i].t][K]=de[a.i][a.k]+D;
                if(!used[Rode[i].t][K])
                {
                    used[Rode[i].t][K]=1;
                    q.push((edge){Rode[i].t,K});
                }
            } 
        }
    }  
}
int main()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;++i)  scanf("%d",&k[i]);
    for(int i=1;i<=N;++i)  scanf("%d",&w[i]);
    for(int i=1;i<=N;++i)  scanf("%d",&s[i]);
    for(int i=1;i<=M;++i)
    {
        scanf("%d%d%d",&Rode[i].f,&Rode[i].t,&Rode[i].d);
        next[i]=first[Rode[i].f];
        first[Rode[i].f]=i;
    }
    SPFA();
    cout<<min(de[N][0],de[N][1]);
    return 0;
}

RK3399快速上手 | 01- 开发环境搭建(固件烧写、编译工具链安装、kernel编译) 一、编译工具链 编译工具链使用gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu。 下载地址: https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/ wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabi 阅读详情

相关推荐

工业自动化实战:用LabVIEW的DSC模块实现MODBUS-TCP设备控制

本文详细介绍了如何利用LabVIEW的DSC模块实现工业自动化中的MODBUS-TCP设备控制。通过环境准备、核心功能解析、状态机实现及典型工业场景实战,帮助工程师快速掌握稳定可靠的通讯技术,提升工业自动化系统的运行效率。

salt9的博客 1057

【刷题记录】 CODEVS 1391 伊吹萃香 多层图最短路

在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的路,来方便进出。已知妖怪之山上有N个路口(编号1..N),每个路口都被萃香设置了一定质量白洞或者黑洞。原本在各个路口之间有M条单向路,走过每一条路需要消耗一定量的体力以及1个单位的时间。由于白洞和黑洞的存在,走过每条路需要消耗的体力也就产生了变化,假设一条道路两端路口黑白

这里是阿安的博客 418

【TCGA-CRC】TCGA数据读取

本文介绍了如何从TCGA数据库中处理结肠癌(COAD)和直肠癌(READ)的RNA测序数据。首先,通过data.table::fread函数读取基因表达量文件,并检查基因ID和基因名称的一致性。接着,批量读取所有样本的TPM(Transcripts Per Million)数据,并将其合并为表达矩阵。随后,通过匹配样本ID和文件名,确保表达矩阵的列名与样本ID一致。最后,筛选出编码蛋白质的基因,并将处理后的数据保存为Rdata文件。整个过程涉及数据读取、合并、匹配和筛选,为后续的基因表达分析提供了基础。

小八四爱吃甜食的博客 662

伊吹萃香 (Standard IO)

&#13; Description&#13;   在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的路,来方便进出。已知妖怪之山上有N个路口(编号1..N),每个路口都被萃香设置了一定质量...

peter_zhu01的博客 358

华大HC32F460 TCP Client 实验

华大HC32F460 TCP Client 实验

ZhuoWuKeJi的博客 649

​ISP算法及架构分析介绍

ISP算法及架构分析介绍ISP即Image Signal Processor,是一种图像处理架构,不是我们用的下载器。ISP其实算是图像处理的一个特例,一般应用于前端设备(相对于SENSOR),从结果上看就是将RAW数据转换成压缩后的RGB(一般)数据,供后续CPU使用(识别、压缩等)。市面上很少有直接介绍ISP的书籍或者资料,今天我们主要是聊一聊ISP算法的架构,这样大...

OpenFPGA的博客 5404

【算法练习】CodeVs1391 伊吹萃香(分层图最短路)

题意 在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的路,来方便进出。已知妖怪之山上有N个路口(编号1..N),每个路口都被萃香设置了一定质量白洞或者黑洞。原本在各个路口之间有M条单向路,走过每一条路需要消...

Pengwill's Blog 403

关于“为爱发电”的一些说明~~

专栏教学资料+工程文件

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2674

【分层图最短路】 2920 -- 【模拟试题】伊吹萃香

2920 – 【模拟试题】伊吹萃香 ** Description ** 在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时 改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的 路,来方便进出。已知妖怪之山上有 N个路口(编号 1…N),每个路口都被萃香设置了一...

qq_43084104的博客 424

Qt EGLFS 图形后端详解

EGLFS (EGL Full Screen) 是Qt框架在嵌入式Linux系统中的高性能图形显示后端,它提供了直接基于EGL和OpenGL ES的硬件加速渲染解决方案。

浩瀚之水的专栏 511

【报错解决】OpenClaw 报错 ENOENT: no such file or directory, open ‘/root/.npmrc‘:配置文件路径不存在

本文分析了OpenClaw平台在国产操作系统环境下运行时出现的ENOENT: no such file or directory, open '/root/.npmrc'错误。该问题源于容器环境中root用户的npm配置文件缺失,导致插件依赖安装失败。文章详细解释了npm配置加载机制和容器环境的特殊性,提出了四种解决方案:手动创建配置文件、写入基础配置、使用全局配置替代以及容器启动时自动初始化。最后指出该错误暴露了工程中对默认路径盲目信任的问题,强调显式声明运行环境依赖的重要性。

博客 2015

伊吹萃香

网上竟然没有能看的懂的解释,我也是醉了 搞了好几个小时才找着一份代码,硬是看懂了 思路:记一个dis[i][j]数组,i表示节点,j表示时间是奇数还是偶数,0是偶数,1是奇数 某一个点的状态是由上一秒转移来的,而这两秒一定一个是奇数一个是偶数,所以1状态由0转移,0状态由1转移,黑洞需要翻转,而奇数秒的状态一定是被反转了的,偶数是没反转的,而这个可以用异或来搞定 因为0^1=1,1^1==0

hychychyc 900

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【codevs 1391】伊吹萃香

题目描述 在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的路,来方便进出。已知妖怪之山...

chuiren0937的博客 126

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[codevs 1391] 伊吹萃香

题目描述在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的 路,来方便进出。已知妖怪之山上有 N个路口(编号 1..N),每个路口都被萃香设置了一定质量白洞或者黑洞。原本在各个路口之间有 M 条单向路,走过每一

Bill_Yang_2016的博客 488

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[Codevs P1391]伊吹萃香

链接 题目描述 Description 在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的路,来方便进出。已知妖怪之山上有N个路口(编号1..N),每个路口都被萃香设置了一定质量白洞或者黑洞。原本在各个路口

Taunt_的博客 513

codevs1391 伊吹萃香

题目描述 Description 在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力最少的路,来方便进出。已知妖怪之山上有N个路口(编号1..N),每个路口都被萃香设置了一定质量白洞或者黑洞。原本在各个路口之间有

loi_black蒟蒻的博客 722

[codevs1391]伊吹萃香

题目←东方系列的可做题…… 每点有原色 -> 反色两种状态,所以把数组开双倍大 i表示原色,i+n表示与原色颜色相反 注意在路上走也是消耗时间的,到达时目标点已经变色了 建好图之后暴力跑最短路就可以了,最后在n和n + n里取min 其实spfa和dij都能过,一开始T掉是因为数组开小了……#include<iostream> #include<cstdio> #include<algor

LOI_pingxing的博客 708

【最短路】codevs 1391 伊吹萃香

题目链接:http://codevs.cn/problem/1391/

FAreStorm的博客 1240

Codevs 1391 伊吹萃香

据说是分层图最短路 咳

Mercury的博客 418

[CODEVS P1391]伊吹萃香

原题链接完蛋 被自己蠢哭 调了一个上午是因为 我把松弛操作写在了 for循环的外面今天也依旧是闪☆亮的一天    嗯说正经的 拆成两张图 两张互相更新 把不同时间的两个点 转入一个图里 然后再分开#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cmath>

今天的北宅依旧没有回家 501

codevs 1391 伊吹萃香 分层图spfa

GG

Loi_cgold 319

Codevs 1391 伊吹萃香/虫洞

Codevs 传送门 解法:因为这道题中颜色在一直变化,所以要用到一个分层图的做法。 因为颜色来回变,所以我们用0 , 1 来表示当前的时间。当时间是0时,所有点的颜色与起初一样;当时间为1 时,所有点的颜色就与起始时相反了。 用spfa来跑最短路时,交叉松弛, 我们用dis[ ][0] 来松弛dis[ ][1] , 用dis[ ][1]来松弛dis[ ][0] 。 具体处理方法在代码的注

hjx 439
上一篇: 洛谷 1311 选择客栈
下一篇: codevs 4650 破损的键盘(stl)
Loi_Mapleleaf
博客等级 码龄10年 17粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值