题目传送门:洛谷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\ ...
随机推荐
-
ajax之 get post请求
get请求 function get(){ $.get( "./Aservlet?id=5", function(data, textStatus, jqXHR){ $(" ...
-
python中文字符乱码(GB2312,GBK,GB18030相关的问题)
转自博主 crifan http://againinput4.blog.163.com/blog/static/1727994912011111011432810/ 在玩wordpress的一个博客搬 ...
-
sublime SublimeTmpl 添加vue模板
sublime2安装时候报错在control中加下面的代码 重新启动,可以进行安装 import urllib2,os; pf='Package Control.sublime-package'; i ...
-
单例模式/singleton模式/创建型模式
Java实现要点: 私有构造方法 线程安全(并发的考虑) 延迟加载(效率的考虑,对于较大的类在使用时在加载) 公有方法访问单一实例 常见单例模式代码及问题 //无延迟加载,常驻内存(即使不使用) cl ...
-
NodeJs - 序列化
https://nodejs.org/dist/latest-v5.x/docs/api/querystring.html 序列化: querystring.stringify({name:'Lee' ...
-
python学习之js从0开始
<html> <head> <title>js页面</title> <script src="js/old_boy.js"&g ...
-
ZOJ 3601 Unrequited Love 【STL__pair_的应用】
下面这个例子就是 STL:pair 的用法 #include <iostream> #include <utility> #include <string> usi ...
-
webpack4 系列教程(十一):字体文件处理
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十一):字体文件处理>原文地址.或者来我的小站看更多内容:godbmw.com 0. 课程介 ...
-
JMeter学习(十二)分布式部署(转载)
转载自 http://www.cnblogs.com/yangxia-test Jmeter 是java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有 ...
-
poj 1328 Radar Installation(贪心+快排)
Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...