NOIP2009 t3 最优贸易
题目传送门:洛谷P1073
dalao们都用的tarjan啊拓扑排序啊之类的玩意儿,我这个蒟蒻不会,只想到了极其暴力的分层图最短路
设三个状态
0表示没有发生任何买卖的情况
1表示买了没有卖的情况
2表示已经卖了的情况
这样建出来一个3层的图,用dis[i][j]表示从起点到i点,处在j状态下获得的最大收益
状态转移方程://id就是从哪个点来
对于所有的状态,都可以在同状态下相互更新dis值,所以
dis[to][sit]=max(dis[to][sit],dis[id][sit])
状态1可以由状态0时购买水晶球得到,购买是减收益,所以
dis[to][1]=max(dis[to][1],dis[id][0]-pri[to])
状态2可以由状态1时卖出水晶球得到,卖出增加了收益,所以
dis[to][2]=max(dis[to][2],dis[id][1]+pri[to])
注意有可能会出现不买不卖的情况,也就可以理解为在某一点买了马上又卖,给每个点加个自环就可以处理这种情况了
观察状态转移方程,发现有负权边,不能用dijkstra,所以spfa走起
最后输出dis[n][2],终点的状态2
AC代码:
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- using namespace std;
- const int INF=;
- int n,m=;
- struct star{//链式前向星
- int u,v;
- }edge[];
- int last[],next[];
- void addedge(int u,int v){//加边
- m++;
- edge[m]=(star){u,v};
- }
- void starinit(){//前向星初始化
- for(int i=;i<=n;i++) last[i]=-;
- for(int i=;i<=m;i++){
- int flag=edge[i].u;
- next[i]=last[flag];
- last[flag]=i;
- }
- }
- int pri[];//每个点水晶球的价格
- struct mem{
- int id,sit;
- }que[];
- int head,tail;
- void push(mem pig){
- que[tail]=pig;tail++;
- }
- void pop(){head++;}
- int dis[][],book[][];
- void spfa(int sta){
- head=;tail=;
- for(int i=;i<=n;i++){dis[i][]=-INF;dis[i][]=-INF;dis[i][]=-INF;book[i][]=;book[i][]=;book[i][]=;}
- dis[][]=;
- book[sta][]=;
- push((mem){sta,});
- for(;head<tail;){
- int id=que[head].id;
- int sit=que[head].sit;
- for(int i=last[id];i!=-;i=next[i]){
- int to=edge[i].v;
- if(dis[to][sit]<dis[id][sit]){//通用转移方程
- dis[to][sit]=dis[id][sit];
- if(book[to][sit]==){
- book[to][sit]=;
- push((mem){to,sit});
- }
- }
- switch(sit){
- case :{
- if(dis[to][]<dis[id][]-pri[to]){//0->1
- dis[to][]=dis[id][]-pri[to];
- if(book[to][]==){
- book[to][]=;
- push((mem){to,});
- }
- }
- break;
- }
- case :{
- if(dis[to][]<dis[id][]+pri[to]){//1->2
- dis[to][]=dis[id][]+pri[to];
- if(book[to][]==){
- book[to][]=;
- push((mem){to,});
- }
- }
- break;
- }
- }
- }
- book[id][sit]=;
- pop();
- }
- }
- int main(){
- m=;
- int cirno;
- cin>>n>>cirno;
- for(int i=;i<=n;i++){
- scanf("%d",&pri[i]);
- }
- for(int i=;i<=cirno;i++){
- int u,v,type;
- scanf("%d%d%d",&u,&v,&type);
- addedge(u,v);
- if(type==) addedge(v,u);
- }
- for(int i=;i<=n;i++) addedge(i,i);//加自环
- starinit();
- spfa();
- cout<<dis[n][];
- return ;
- }
- /*
- 自测
- 7 8
- 9 2 3 2 10 1 7
- 1 2 1
- 2 3 1
- 3 7 1
- 7 6 1
- 6 3 1
- 7 4 1
- 4 5 1
- 5 3 1
- */
NOIP2009 t3 最优贸易的更多相关文章
- 「NOIP2009」最优贸易 题解
「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...
- 「NOIP2009」最优贸易
「NOIP2009」最优贸易 「NOIP2009」最优贸易内存限制:128 MiB时间限制:1000 ms 题目描述C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意 ...
- 【NOIP2009 T3】 最佳贸易 (双向SPFA)
C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...
- 【NOIP2009】最优贸易
描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通 ...
- #2590. 「NOIP2009」最优贸易
C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...
- NOIP2009 压轴---最优贸易
链接:https://ac.nowcoder.com/acm/contest/959/H来源:牛客网 C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市.任意两个城市之间最多只有一条道路 ...
- [NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP
Description&Data 题面:https://www.luogu.org/problemnew/show/P1073 Solution Tarjan对联通块缩点,在DAG上按照拓扑序 ...
- [Luogu 1073] NOIP2009 最优贸易
[Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ...
- [NOIP2009]最优贸易(图论)
[NOIP2009]最优贸易 题目描述 CC 国有 \(n\) 个大城市和 \(m\) 条道路,每条道路连接这 \(n\) 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 \(m\ ...
随机推荐
- 计算机基础理论知识梳理篇(一):数据类型长度、内存页、IPC
字长与数据类型长度 字长指CPU在同一时间能够处理二进制数据的位数,是由其外接数据总线(地址总线决定了CPU的寻址空间,如16位微型机的地址总线为20位,其可寻址空间为220 = 1MB)的条数决定的 ...
- Aerospike-内存和硬盘混合存储的kv数据库
为什么会有Aerospike? Redis是一个纯内存型数据库,性能上没有多大问题. 但这又带来一个新问题,内存是很贵的,所以全内存的存储成本非常昂贵.为了节省成本,我们需要把一部分不经常用到的数据存 ...
- 中间件方法必须返回Response对象实例(tp5.1+小程序结合时候出的问题)
前言:在最近开发小程序通过中间件检查是否携带token时候报的一个错误 解决方法: 根据手册中需要return出去才可以不报错
- 第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案)
一. 简介 EF连接数据库有三种模式,分别是DBFirst.ModelFirst.CodeFirst,分别适用于不同的开发场景. 该章节,将主要介绍EF的DBFirst连接SQLServer数据库和M ...
- [物理学与PDEs]第5章习题7 各向同性材料时稳定性条件的等价条件
在线性弹性时, 证明各向同性材料, 稳定性条件 (5. 27) 等价于 Lam\'e 常数满足 $$\bex \mu>0,\quad \lm+\cfrac{2}{3}\mu>0. \ee ...
- SpringBoot之解决云服务器VPS在所处云端集群的内网不能解析域名的问题:java.net.UnknownHostException:abc.cn: Temporary failure in name resolution
一.起因与原因分析过程 前端小伙伴儿告诉我,说服务器崩了. 请求数据接口,接口有响应,但报的json提示指向:数据库异常错误. 遂登陆云主机查看日志,核心记录显示如下: 2018-11-09 22:1 ...
- rem自适应js
Rem自适应js---flexible.min.js 网上看到很多移动端适配的各种方法,由于原来工作中对rem的疏忽,所以决定重新学习rem~ 由于移动端特殊性,本文讲的是如何使用rem实现自适应 ...
- JavaScript的数据类型和变量
1. 数据类型:JS使用弱类型,共4种基本类型,其数据可以是变量,也可以是常量. a) 数值(整数和实数) b) 字符串型(用“”号或‘’括起来的字符或数值) c) ...
- 【先验知识归纳】Flask快速入门
本文参考:快速入门 - Flask 0.10.1 文档 路由 Flask使用route修饰器来关联URL与程序函数: @app.route('/') def hello_world(): return ...
- java 面经
1.什么是Java虚拟机(JVM)?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. ...