Codevs 1391 伊吹萃香/虫洞
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 伊吹萃香/虫洞相关推荐
- codevs 1391 伊吹萃香
*ps:老实说我真不想调试这个程序(T ^ T) go to the problem 题目描述 Description 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白 ...
- [codevs 1391] 伊吹萃香
题目描述 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带 ...
- CODEVS 1391 伊吹萃香 多层图最短路
1.题意: 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们 ...
- 【codevs 1391】伊吹萃香
题目描述 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带 ...
- Code vs 1391 伊吹萃香(虫洞)
QAQ 思路:SPFA+分层图 dis[i][j]表示第i个节点在第j个时间的最短路径 可以看出j并不需要全部的记下来,我们只需要用0,1来记录时间就行了 同理vis数组同样两维 根据题目要求拓展的花 ...
- [Codevs P1391]伊吹萃香
##链接## 题目描述 Description 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些 ...
- codevs1391 伊吹萃香
题目描述 Description 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由 ...
- [ CodeVS冲杯之路 ] P1116
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1116/ 数据很小,DFS可A,每层枚举颜色,判断相邻的点是否有重复的颜色,记得回溯时把颜色染回0,即无颜色 这里我使用 ...
- 【贪心】【codevs】1214 线段覆盖
http://codevs.cn/problem/1214/ 我去这个题...wa的我都没脾气了... 我写while(~scanf("%d", &n))竟然是不对的... ...
最新文章
- 对数据库表中的某一字段去重分组排序
- 怎么用Leangoo管理Bug
- Nutch爬取Ajax请求的动态网页
- js判断undefined和null
- dirty_background_ration 与 /proc/sys/vm/dirty_ratio
- GraphQL query的schema校验
- 如何使用jMeter发送两个逻辑上相关的HTTP请求
- 使用系统调用pipe建立一条管道线_使用Unixbench对服务器综合性能打分及测试结果...
- oracle存储过程function,oracle 存储过程跟function
- MySql8.0.11的安装与使用
- Flex 得到一个对象的所有属性
- 瑞芯微读取寄存器_瑞芯微Android软件中添加ALC5640 音频CODEC 的寄存器修改
- CSS世界-第一、二章
- 暴风影音怎么旋转视频?暴风影音旋转视频方法
- 欢迎加入可一科技,见证区块链技术的力量
- 华为云账号登录流程和方法
- Ardupilot移植经验分享(1)
- 一、Ubuntu安装HomebridgeUI
- linux 路由转发 ipv6,IPv6路由
- 服务器防御基础(常见的几种攻击手段以及应对方式)