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\ ...
随机推荐
- 通过nginx访问linux目录
http { ...... autoindex on; autoindex_exact_size off; autoindex_localtime on; server { listen 80; .. ...
- html页面中引入自签名证书的js web资源出现net::ERR_CERT_AUTHORITY_INVALID
其实是浏览器客户端对自签名的内容认为不安全引起的,临时方法可以再浏览器中先直接访问下那个自签名的https地址,然后再访问有引用的那个页面就可以了. 以下内容引用自https://www.morong ...
- Linux Centos7.x下安装部署Jira和confluence以及破解方法详述
简述 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. Confluence是一个专业的企业知识管 ...
- 关于try catch finally 三者之间的关系(JDK 1.8)
话不多说 线上代码 package System; import java.util.Scanner; /** * * @author chris * */ public class TryCathf ...
- LeetCode刷题(Java)
第一题 class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = ...
- jenkins持续集成原理
转载: 原文地址:http://www.2cto.com/kf/201609/544550.html 持续集成 开发中,我们经常遇到一些奇怪问题,比如本地可以编译成功的代码但是同事们更新代码后编译出错 ...
- 更换gcc工具链
title: 更换gcc工具链 date: 2019/1/16 19:27:51 toc: true --- 更换gcc工具链 下载后解压到一个临时目录先看看文件结构 mkdir tmp tar xj ...
- npm install 之前做的事
在一个项目目录中,npm install之前,需要npm init,npm init会问你几个问题,有的需要输入,不想输入的一路回车就行,之后会自动创建一个package.json文件,有了这个pac ...
- linux下安装与配置Redis
1.安装 (1)获取源代码 wget http://download.redis.io/releases/redis-4.0.8.tar.gz (2)解压 tar xzvf redis-4.0.8.t ...
- HTML(九)HTML 条件注释规范
HTML 条件注释(hack常用) IE条件注释是微软从IE5开始就提供的一种非标准逻辑语句,作用是可以灵活的为不同IE版本浏览器导入不同html元素.很显然这种方法的最大好处就在于属于微软官方给出的 ...