虫洞

【题目描述】

  N个虫洞,M条单向跃迁路径。从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间。虫洞有白洞和黑洞之分。设一条跃迁路径两端的虫洞质量差为delta。

  1. 从白洞跃迁到黑洞,消耗的燃料值减少delta,若该条路径消耗的燃料值变为负数的话,取为0。

  2. 从黑洞跃迁到白洞,消耗的燃料值增加delta。

  3. 路径两端均为黑洞或白洞,消耗的燃料值不变化。

  而且每过1单位时间黑洞变为白洞,白洞变为黑洞。在飞行过程中,可以选择在一个虫洞停留1个单位时间,如果当前为白洞,则不消耗燃料,否则消耗s[i]的燃料。现在请你求出从虫洞1到N最少的燃料消耗,保证一定存在1到N的路线。

【输入格式】

  第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。

【输出格式】

  一个整数,表示最少的燃料消耗。

【样例输入】

  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

【样例输出】

  130

【数据范围】

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

  对于60%的数据: 1<=N<=1000,1<=M<=5000

  对于100%的数据: 1<=N<=5000,1<=M<=30000

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

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

【样例说明】

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

试题分析:其余的不怎么难,难点就在于如何使黑洞变成白洞或者黑洞走到白洞一类复杂的东西。

     其实只要细细思考一下,这道题还是不那么难的。

     对于每一个"洞",我们不知道它是那种洞,所以我们干脆将这个洞分成一白一黑两个洞。

     设i为白洞,i+N为黑洞,那么我们需要这样建图:

        ①将第i个点的黑洞白洞连起来(在这个洞等一时刻)

        ②将这些点按照给定的输入连起来,注意它的另外一种洞也要与对面的另外一种洞连起来。

      然后对于这样的一个图来说,我们只需要跑最短路就可以了,注意最后只要在编号为N的洞就好,不关心它是哪一个洞。

     所以要取min(dis[end],dis[end+N])//编号为end的洞是黑洞或者白洞。

     还有一个要注意的就是col[1]是黑洞我们要从1+N做,否则从1做

     IQ掉线了将col[1]==1写成了col[1]==0 调了10分钟 QAQ

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
//#include<cmath> using namespace std;
const int INF = 9999999;
#define LL long long inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int N,M;
bool col[200001];//1黑 0白
int w[200001],s[200001];
int Node[1000000],Cost[1000000],Root[1000000],Next[1000000];
int dis[200001];bool inq[200001];
int que[1000001];
int cnt=0; void addedge(int u,int v,int w){
cnt++;
Node[cnt]=v;
Cost[cnt]=w;
Next[cnt]=Root[u];
Root[u]=cnt;
}
int SPFA(int s,int t){
if(col[s]==1) s=N+1;
memset(dis,INF,sizeof(dis));
memset(inq,false,sizeof(inq));
dis[s]=0,inq[s]=true;
int tail=0; que[++tail]=s;
for(int head=1;head<=tail;head++){
for(int x=Root[que[head]];x;x=Next[x]){
if(dis[Node[x]]>dis[que[head]]+Cost[x]){
dis[Node[x]]=dis[que[head]]+Cost[x];
if(!inq[Node[x]]){
inq[Node[x]]=true;
que[++tail]=Node[x];
}
}
}
inq[que[head]]=false;
}
return min(dis[t],dis[t+N]);
} int main(){
N=read(),M=read();
for(int i=1;i<=N;i++) col[i]=read();
for(int i=1;i<=N;i++) w[i]=read();
for(int i=1;i<=N;i++){
s[i]=read();
}
for(int i=1;i<=M;i++){
int u=read(),v=read(),k=read();
if(col[u]==col[v]){
addedge(u,v+N,k);
addedge(u+N,v,k);
}
else{
int tmp=abs(w[u]-w[v]);
addedge(u+N,v+N,k+tmp);
addedge(u,v,max(k-tmp,0));
}
}
for(int i=1;i<=N;i++){
addedge(i,i+N,0);
addedge(i+N,i,s[i]);
}
printf("%d\n",SPFA(1,N));
return 0;
}

【最短路】NOIP模拟赛 虫洞的更多相关文章

  1. NOIP模拟赛 虫洞

    [题目描述] John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N (从1. ...

  2. [noip模拟赛]虫洞holes<SPFA>

    虫洞(holes.cpp/c/pas) [题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差 ...

  3. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  4. NOIP模拟赛 6.29

    2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  8. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  9. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

随机推荐

  1. 20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)

    1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. ...

  2. bzoj 3035 二分答案+二分图最大匹配

    大原来做的一道题,偷懒直接粘的原来的程序 http://www.cnblogs.com/BLADEVIL/p/3433520.html /******************************* ...

  3. Python 语言使用中遇到的问题汇总

    1.python中的传值和传引用 和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方式.实际上,这种方式相当于传值和传 ...

  4. linux驱动基础系列--Linux mmc sd sdio驱动分析

    前言 主要是想对Linux mmc子系统(包含mmc sd sdio)驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.块设备驱动.设备模型等也不进行详细说明原 ...

  5. Yii 1.1.17 二、Gii创建后台与后台登录验证

    一.用Gii创建后台模块 1.启用gii,在config/main.php 'gii' => array( 'class' => 'system.gii.GiiModule', 'pass ...

  6. linux中断系统那些事之----中断处理过程【转】

    转自:http://blog.csdn.net/xiaojsj111/article/details/14129661 以外部中断irq为例来说明,当外部硬件产生中断时,linux的处理过程.首先先说 ...

  7. ES的优化布局

    分词优化:IK Analyser Elastic Search 5.x官方提供的中文搜索并不友好,分词时经常将一句话分成很多单字,这时候可以使用IK Analyser插件进行优化,当然你在写java代 ...

  8. 微信小程序验证码获取倒计时

    wxml <button disabled='{{disabled}}' bindtap="goGetCode">{{code}}</button> js ...

  9. C#ActiveX安装项目

    C#开发的ActiveX控件发布方式有三种: 制作客户端安装包,分发给客户机安装: 制作在线安装包,客户机联机安装: 使用html中object的codebase指向安装包地址. 以下为制作安装包: ...

  10. springboot+maven+thymeleaf配置实战demo

    本案例使用thymeleaf,与springboot配置使用.thymeleaf是一种模板语言,可以动态或者静态显示文本内容. 1 .项目结构 2.构建springboot项目 通过idea的new ...