[東方S2] 伊吹萃香

  • 题目描述
    • 题目
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 输出说明
      • 数据范围
  • 解决过程
    • 思路
    • 代码
  • 感想

题目描述

题目

题目描述

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

已知妖怪之山上有N个路口(编号1…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的体力。

输出格式

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

样例输入

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

输出说明

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

数据范围

对于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

前面一堆废话 ,题目看起来挺麻烦的,我们用分层图来处理

解决过程

本蒟蒻觉得还是有一丢丢麻烦的,我太弱了

思路

分层图
建两层图,第 0 层表示当前 白洞,第 1 层表示当前 黑洞
由于分层图有两种建法,在此只阐述一种做法,另一种可以上网查阅

这两层图怎么连呢???
我们先将 自己所代表的黑洞的点自己所代表的白洞的点 连边
根据题意,当前如果是白洞,则不需要耗费体力
所以 从白到黑 的消耗为 0


但是如果当前的是黑洞的话,耗费的体力为 s[当前点](题目中 s 表示不动的消耗)


如果一条边的两端点 都是白洞 或者 都是黑洞,从一个点 走到 另一个点 后 两边就变成了 相反的颜色,(直接异或即可)

但是当他们不一样的时候,就需要判断当前哪个是白洞,哪个是黑洞,从一个点 走到 另一个点 后 两边同样变成了 相反的颜色,这时我们需要把两边的 w 相减 得到一个需要减去或加上的值(delta),(根据情况判断是加还是减),注意,此时减去的时候 取 边的消耗减去delta 和 0 中的较大值 即可遵循题意,避免出现负数

剩下的使用最短路模板即可

代码

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <utility>
#include <cmath>
#define pa pair <int ,pair <int ,int > >
using namespace std;
/*0 ^ 0 = 0,1 ^ 0 = 1,0 ^ 1 = 1,1 ^ 1 = 0.
*/
priority_queue <pa ,vector <pa > ,greater <pa > > p;
const int MAXN = 5010;
const int MAXM = 30010;
struct node {int to ,next ,qu;
}edge[MAXM];
int head[MAXN] = {0},cnt = 0;
void add (int from ,int to ,int quan) {edge[++ cnt].next = head[from];head[from] = cnt;edge[cnt].to = to;edge[cnt].qu = quan;return ;
}
int n ,m ,hole[MAXN],w[MAXN],s[MAXN],dis[MAXN][2],inq[MAXN][2];
int sx (int r1 ,int r2) {return hole[r1] ^ r2 ? w[r1] /* 从白洞到黑洞 */ : 0;
}
void SPFA (int start) {memset (dis ,0x3f ,sizeof (dis));dis[start][0] = 0;inq[start][0] = 1;if (hole[start]) dis[start][1] = s[start]; else dis[start][1] = 0;//白洞inq[start][1] = 1;p.push(make_pair (dis[start][1] ,make_pair (start ,1)));p.push(make_pair (dis[start][0] ,make_pair (start ,0)));while (!p.empty()) {int u = p.top().second.first;int k = p.top().second.second;inq[u][k] = 0;p.pop();if (dis[u][k ^ 1] > dis[u][k] + sx (u ,k)) {//原地停留 dis[u][k ^ 1] = dis[u][k] + sx (u ,k);if (!inq[u][k ^ 1]) {inq[u][k ^ 1] = 1;p.push(make_pair (dis[u][k ^ 1] ,make_pair (u ,k ^ 1)));}}for (int q = head[u];q;q = edge[q].next) {int v = edge[q].to;if (hole[u] != hole[v]) {//两种洞不同 int data;if (hole[v] ^ k == 1) {data = abs (w[u] - w[v]);}else data = -abs (w[u] - w[v]);if (dis[v][k ^ 1] > dis[u][k] + max (edge[q].qu - data ,0)) {dis[v][k ^ 1] = dis[u][k] + max (edge[q].qu - data ,0);if (!inq[v][k ^ 1]) p.push(make_pair (dis[v][k ^ 1] ,make_pair (v ,k ^ 1))) ,inq[v][k ^ 1] = 1;}}else if (dis[v][k ^ 1] > dis[u][k] + edge[q].qu) {dis[v][k ^ 1] = dis[u][k] + edge[q].qu;if (!inq[v][k ^ 1]) p.push(make_pair (dis[v][k ^ 1] ,make_pair (v ,k ^ 1))) ,inq[v][k ^ 1] = 1;}}}
}
int main () {freopen("suika.in","r",stdin);freopen("suika.out","w",stdout);scanf("%d%d",&n ,&m);for (int q = 1;q <= n;++ q) {scanf("%d",&hole[q]);}for (int q = 1;q <= n;++ q) {scanf("%d",&w[q]);}for (int q = 1;q <= n;++ q) {scanf("%d",&s[q]);}int a1,a2,a3;for (int q = 1;q <= m;++ q) {scanf("%d%d%d",&a1 ,&a2 ,&a3);add (a1 ,a2 ,a3);}SPFA (1);printf ("%d\n",max (dis[n][0] ,dis[n][1]));return 0;
}

感想

谢谢大家

——2020.8.18

[東方S2] 伊吹萃香相关推荐

  1. cogs 997. [東方S2] 射命丸文

    二次联通门 : cogs 997. [東方S2] 射命丸文 /*cogs 997. [東方S2] 射命丸文二维前缀和枚举每个子矩阵更新最大值.. 莫名rank1 */ #include <cst ...

  2. cogs 998. [東方S2] 帕秋莉·诺蕾姬

    二次联通门 : cogs 998. [東方S2] 帕秋莉·诺蕾姬 交上去后发现自己没上榜 就想着加点黑科技 把循环展开一下 结果WA了.. 万恶的姆Q /*cogs 998. [東方S2] 帕秋莉·诺 ...

  3. 東方茸回廊 汉化补丁

    [遊戲名稱/Name]:東方茸回廊 [遊戲廠商/Company]: PAXWool [遊戲類型/Type]:即時3D  [發售日期/Sale date]:2010/1/16   这是一款以东方Proj ...

  4. cogs 944. [東方S3] 藤原妹红

    二次联通门 : cogs 944. [東方S3] 藤原妹红 /*cogs 944. [東方S3] 藤原妹红最小生成树 + 树形dp首先对原图跑最下生成树后建出一棵树在树上进行dp先走到叶子节点, 顺便 ...

  5. 東方風魔録 无限修改

    東方風魔録 无限修改 東方風魔録 -the story of eastern wind- 第一个修改是:在得到一点武器值后直接满 炸弹无限使用(不减BOMB) 注意 Back 東方風魔録 -the s ...

  6. cogs 943. [東方S3] 铃仙•优昙华院•稻叶

    二次联通门 : cogs 943. [東方S3] 铃仙•优昙华院•稻叶 /*cogs 943. [東方S3] 铃仙·优昙华院·稻叶概率dp貌似做麻烦了邻接矩阵和链式前向星都用上了...dp[pos][ ...

  7. (C77)[こすぷれ喫茶娘々]東方鎖宝録 汉化补丁

    (C77)(同人ゲーム)[东方][こすぷれ喫茶娘々] 東方鎖宝録 汉化补丁 有点类似于泡泡龙的游戏,下载好后用DAEMON Tools等虚拟光驱软件加载bin文件安装即可. 安装的应用程序尽量用APP ...

  8. 東方 project 联机版开发日记(1)

    2019独角兽企业重金招聘Python工程师标准>>> touhou-project online Intro 东方project是一个典型的2d射击游戏(STG),这里我要实现的是 ...

  9. 東方天空璋 1.00a 修改器 By:美夜赤月

    这次追加了以下三项功能 1.全体加速 2.敌BOSS秒杀 3.敌人技能时间停止 其他功能都是基本的,并取消了[スコア]跟[最大得点] 这两项修改. 因为该两项功能并不实用,所以该作不考虑添加. 下载地 ...

最新文章

  1. 利用onSaveInstanceState()方法保存Activity状态
  2. KVM — 与 QEMU 和 Libvirt 的关系
  3. 体系化认识RPC--转
  4. 【Linux基础】 Redhat6.5中OpenOffice的安装
  5. 使用ST05分析IBASE search identical select
  6. .Net转Java自学之路—基础巩固篇八—总结(封装、继承、多态)
  7. 不会配置HTTPS?给我5分钟,手把手教你
  8. linux配置端口ipv6地址,linux配置ipv6地址命令
  9. 【小梅哥SOPC学习笔记】系统时钟的使用
  10. 充满含金量的一场云原生Meetup,入场券免费发送中……
  11. Android笔记(十)ListView
  12. mysql数据库查询减法计算_我对数据库关系代数中减法sql实现的思考:mysql脚本...
  13. python 内存优化_Python 黑魔法之内存优化
  14. LeetCode算法题-Delete Node in a Linked List(Java实现)
  15. 业务逻辑需要放在service层_CTO问:Service层真的需要接口吗?
  16. python3怎么查看帮助文档pydoc?
  17. 基于wincc的虚拟电梯设计_基于WinCC的电梯PLC控制仿真.doc
  18. 关于灰鸽子和黑软的一些看法
  19. css判断手机端还是pc端,JavaScript判断设备是手机端还是PC端,并加载不同的css/js文件...
  20. cv2.cvtColor报错

热门文章

  1. Unity MVC模式简述
  2. 必应地图api文档,微软必应地图web开发版详解,可以在国内使用国外地图
  3. Java中mediaplayer_MediaPlayer 用法(一) - 一切皆有可能 - JavaEye技术网站
  4. 快速幂(python实现)
  5. PMP中的沟通管理、相关方管理的简单介绍
  6. 案例:互联网金融行业客户价值分析
  7. VISTA/win7添加网络中xp系统共享打印机错误的解决方法
  8. Docker学习记录(到docker-compose)
  9. docker-compose映射udp端口
  10. 互联网起源之发现电磁波