Codevs 传送门


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

#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
int n,m,dis[5009][2],w[5009],s[5009],co[5009];
int head[5009],nxt[35009],num[35009],cost[35009],cnt;
int ans;
bool vis[5009][2];//记录某个点某种颜色是否在队列中
struct H{int x,co;
};
int abs(int x){return x>=0?x:-x;}
void add(int x,int y,int z)
{num[++cnt]=y;nxt[cnt]=head[x];head[x]=cnt;cost[cnt]=z;
}
void spfa()
{memset(dis,127,sizeof(dis));queue <H> q;H k; k.x=1,k.co=co[1];q.push(k);vis[1][co[1]]=1;dis[1][co[1]]=0;while(!q.empty()){k=q.front();q.pop();vis[k.x][k.co]=0;int u=k.x,v;for(int i=head[k.x];i;i=nxt[i]){int v=num[i],d=abs(w[u]-w[v]);int cv,dd;if(k.co==co[u]) cv=co[v];//是否与初始颜色相同,如果u的颜色与起始相同,那么我们//想把v的颜色设为与起始相同的,在下面松弛时再将v的颜色反过来,就实现了交叉松弛 else cv=co[v]^1;if(cv==k.co) dd=cost[i];else{if(k.co==1) dd=cost[i]+d;//从1->0 else dd=cost[i]-d;if(dd<0) dd=0;}//体力if(dis[v][cv^1]>dis[k.x][k.co]+dd)//交叉松弛{dis[v][cv^1]=dis[k.x][k.co]+dd;if(!vis[v][cv^1]){q.push((H){v,cv^1});vis[v][cv^1]=1;} }   }//处理停留,自己到自己int dd;if(k.co==0) dd=0;else dd=s[k.x]; //如果是白洞,就不花费体力if(dis[k.x][k.co^1]>dis[k.x][k.co]+dd)//交叉松弛{dis[k.x][k.co^1]=dis[k.x][k.co]+dd;if(!vis[k.x][k.co^1]){q.push((H){k.x,k.co^1});vis[k.x][k.co^1]=1;}}}ans=min(dis[n][1],dis[n][0]);
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&co[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++){int u,v,k;scanf("%d%d%d",&u,&v,&k);add(u,v,k);}spfa();printf("%d",ans);return 0;
}

Codevs 1391 伊吹萃香/虫洞相关推荐

  1. codevs 1391 伊吹萃香

    *ps:老实说我真不想调试这个程序(T ^ T) go to the problem 题目描述 Description 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白 ...

  2. [codevs 1391] 伊吹萃香

    题目描述 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带 ...

  3. CODEVS 1391 伊吹萃香 多层图最短路

    1.题意: 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们 ...

  4. 【codevs 1391】伊吹萃香

    题目描述 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带 ...

  5. Code vs 1391 伊吹萃香(虫洞)

    QAQ 思路:SPFA+分层图 dis[i][j]表示第i个节点在第j个时间的最短路径 可以看出j并不需要全部的记下来,我们只需要用0,1来记录时间就行了 同理vis数组同样两维 根据题目要求拓展的花 ...

  6. [Codevs P1391]伊吹萃香

    ##链接## 题目描述 Description 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些 ...

  7. codevs1391 伊吹萃香

    题目描述 Description 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由 ...

  8. [ CodeVS冲杯之路 ] P1116

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1116/ 数据很小,DFS可A,每层枚举颜色,判断相邻的点是否有重复的颜色,记得回溯时把颜色染回0,即无颜色 这里我使用 ...

  9. 【贪心】【codevs】1214 线段覆盖

    http://codevs.cn/problem/1214/ 我去这个题...wa的我都没脾气了... 我写while(~scanf("%d", &n))竟然是不对的... ...

最新文章

  1. 对数据库表中的某一字段去重分组排序
  2. 怎么用Leangoo管理Bug
  3. Nutch爬取Ajax请求的动态网页
  4. js判断undefined和null
  5. dirty_background_ration 与 /proc/sys/vm/dirty_ratio
  6. GraphQL query的schema校验
  7. 如何使用jMeter发送两个逻辑上相关的HTTP请求
  8. 使用系统调用pipe建立一条管道线_使用Unixbench对服务器综合性能打分及测试结果...
  9. oracle存储过程function,oracle 存储过程跟function
  10. MySql8.0.11的安装与使用
  11. Flex 得到一个对象的所有属性
  12. 瑞芯微读取寄存器_瑞芯微Android软件中添加ALC5640 音频CODEC 的寄存器修改
  13. CSS世界-第一、二章
  14. 暴风影音怎么旋转视频?暴风影音旋转视频方法
  15. 欢迎加入可一科技,见证区块链技术的力量
  16. 华为云账号登录流程和方法
  17. Ardupilot移植经验分享(1)
  18. 一、Ubuntu安装HomebridgeUI
  19. linux 路由转发 ipv6,IPv6路由
  20. 服务器防御基础(常见的几种攻击手段以及应对方式)

热门文章

  1. Python语法基础在线实验闯关
  2. POE技术原理及硬件实现
  3. CentOS6安装nginx+Tomcat7集群并实现自启动
  4. 会议OA项目之会议发布(一)
  5. SQL在线刷题的网站推荐
  6. 兴业银行网关支付,单笔超过1万单子付款提示交易异常交易繁忙,无法成功支付
  7. struts2各个jar包
  8. IK分词工具的使用(java)
  9. 使用Markdown写矩阵、表格和一些数学公式(实用
  10. Android之SeekBar的简单使用