题目传送门:洛谷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 最优贸易的更多相关文章

  1. 「NOIP2009」最优贸易 题解

    「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...

  2. 「NOIP2009」最优贸易

    「NOIP2009」最优贸易 「NOIP2009」最优贸易内存限制:128 MiB时间限制:1000 ms 题目描述C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意 ...

  3. 【NOIP2009 T3】 最佳贸易 (双向SPFA)

    C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...

  4. 【NOIP2009】最优贸易

    描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通 ...

  5. #2590. 「NOIP2009」最优贸易

    C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...

  6. NOIP2009 压轴---最优贸易

    链接:https://ac.nowcoder.com/acm/contest/959/H来源:牛客网 C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市.任意两个城市之间最多只有一条道路 ...

  7. [NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP

    Description&Data 题面:https://www.luogu.org/problemnew/show/P1073 Solution Tarjan对联通块缩点,在DAG上按照拓扑序 ...

  8. [Luogu 1073] NOIP2009 最优贸易

    [Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ...

  9. [NOIP2009]最优贸易(图论)

    [NOIP2009]最优贸易 题目描述 CC 国有 \(n\) 个大城市和 \(m\) 条道路,每条道路连接这 \(n\) 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 \(m\ ...

随机推荐

  1. ubuntu16.04连接wifi

    前提:实验室里没有网线,也没有无线网络,只能用个人手机开热点上网! Then~~ 首先参考了这两篇博文: https://blog.csdn.net/weixin_41762173/article/d ...

  2. Day045--DOM操作

    一. 操作DOM的三步走 - 获取事件源 (找开关) - 事件(点一下) - 处理程序(业务逻辑)(灯亮了) 二. 获取DOM的三种方式 console.log(window); // 查看windo ...

  3. saltstack主机管理项目:主机管理项目架构设计(二)

    1.salt架构图 https://docs.saltstack.com/en/getstarted/system/plugins.html plug-ins(左边):场景可插拔 subsystem- ...

  4. Deepin linux 远程桌面无法被Ubuntu连接

    linux下远程桌面的工具还是有很多的,这个方法主要是解决Ubuntu自带的 Remmina无法远程 Deepin 桌面. 1.安装vncserver的基础服务,输入以下命令: sudo apt-ge ...

  5. Gradle(一)安装配置

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置.面向 ...

  6. python之路(2)集合(set)和字符串格式化

    目录 集合(set) 字符串的格式化(%和format) 集合(set) {‘a’,'b','c','d','e'} 定义:有不同元素组成的集合,集合的元素为不可变类型(数字,字符串,元组),集合是一 ...

  7. JavaScript 日期和时间基础知识

    前言 学习Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于更好地理解javascript中的Date对象. 标准时间 一般而言的标准时间是指GMT和 ...

  8. [物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.2 电磁场的标势与矢势

    1.  标势.矢势:  $$\beex \bea \Div{\bf B}=0&\ra \exists\ {\bf A},\st {\bf B}=\rot{\bf A},\\ \rot{\bf ...

  9. java包

    首先是java.io java.lang java.util  java.lang.math

  10. react中键盘enter事件处理

    对于常见的搜索需求业务场景,用户输入完成后,点击enter事件请求数据,要求不提交页面,实现数据局部更新,这需要用到react中的表单Forms. 处理方法: (1)html书写 form标签中去掉a ...