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\ ...
随机推荐
- java实现sftp客户端上传文件夹的功能
使用的jar: <dependencies> <dependency> <groupId>jsch</groupId> <artifactId&g ...
- laravel 图片验证码
今天看见一个网站登录页面有个图片验证码,想想自己以前好像真没弄过这个玩意,正好现在有时间,准备用laravel来弄个图片验证码出来,不多BB,直接上代码 1.直接使用别人封装好的,composer下载 ...
- Mock7 moco框架重定向
新建一个startupWithRedirect.json [ { "description": "重定向到百度", "request": { ...
- linux device drivers ch02
ch02.构造和运行模块 模块的构造: #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE(&qu ...
- CMDB服务器管理系统【s5day89】:深入理解Java的接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用, ...
- Entity Framework入门教程(12)--- EF进行批量添加/删除
EF6添加了批量添加/删除实体集合的方法,我们可以使用DbSet.AddRange()方法将实体集合添加到上下文,同时实体集合中的每一个实体的状态都标记为Added,在执行SaveChange()方法 ...
- 点评cat系列-简介
面上有很多优秀的 OS 级监控系统 (比如 falcon), 这些监控系统主要聚焦在 CPU/IO/Mem/Disk 和应用端口, falcon 甚至可以监控到 JVM. 但对于应用系统内部的一些监控 ...
- LaTeX技巧561:LaTeX如何让每一章带有目录?
转自: http://blog.sina.com.cn/s/blog_5e16f1770102ds8b.html LaTeX技巧561:LaTeX如何让每一章带有目录? [问题描述] 当前章节列出该章 ...
- 已知 $AB$, 求 $BA$
设 $A,B$ 分别是 $3\times 2$ 和 $2\times 3$ 实矩阵. 若 $\dps{AB=\sex{\ba{ccc} 8&0&-4\\ -\frac{3}{2}& ...
- SQL Server 跨服务器操作
Ø 简介 在工作中编写 SQL 时经常会遇到跨库或跨服务器操作,比如查询时,通过 A 服务器的某张表关联 B 服务器某张表,进行连接查询.或者从另一台服务器中的数据,对当前数据库中的数据进行 CRU ...