当前位置: 首页 > news >正文

P1073题解

题目链接

其实这道题本来应该是一道tarjan缩点+DAG题的,但是有一种更优的方法,即分层图+SPFA.这里我们把图复制两份,即两层,每层图之间点与点之间的关系都是一样的,并且边权都为0.

这三层图第一层图表示没有买入时候的图,第二层图表示买入但还没有卖出的图,第三层图表示已经卖出的图.这样分可以避免无限卖出. 对于第一层和第二层的每个点,两层之间应该是有向边,并且边权应该为价格的负数倍,毕竟买东西肯定要花钱.那么同理卖东西就要加钱.最后我们跑一次SPFA,然后找第三层图的n号节点就可以了.

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
struct node{int u,v;	
};
int n,m,x,y,z,f[N],dis[N];
int t(int x, int y){return x*n+y;}
vector<node>v[N];
void add(int x, int y, int w){v[x].push_back({y,w});
}
void SPFA(){queue<int>q;for(int i=2;i<=3*n;i++) dis[i]=(-1e9);f[t(0,1)]=1, q.push(t(0,1));while(q.size()){int t2=q.front();q.pop(), f[t2]=0;for(int i=0;i<v[t2].size();i++){int u=v[t2][i].u, w=v[t2][i].v;if(dis[t2]+w>dis[u]){dis[u]=dis[t2]+w;if(!f[u]) q.push(u), f[u]=1;}}}
}
signed main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>x;add(t(0,i),t(1,i),-x), add(t(1,i),t(2,i),x);}while(m--){cin>>x>>y>>z;if(z==1){for(int i=0;i<=2;i++) add(t(i,x),t(i,y),0);}else{for(int i=0;i<=2;i++){add(t(i,x),t(i,y),0);add(t(i,y),t(i,x),0);}}}SPFA();if(dis[t(2,n)]==(-1e9)) cout<<0;else cout<<dis[t(2,n)];return 0;
}

http://www.dtcms.com/a/403657.html

相关文章:

  • ShardingSphere 分布式数据库中间件生态
  • 使用时长提升 4 倍,融云 AI Agent 助力中东语聊应用激活新用户
  • 旅行商问题以及swap-2opt应用
  • 【知识图谱:实战篇】--搭建医药知识图谱问答系统
  • shell编程:sed - 流编辑器(3)
  • 建站最便宜的平台免费网络app
  • 《第四届数字信任大会》精彩观点:腾讯经验-人工智能安全风险之应对与实践|从十大风险到企业级防护架构
  • StarRocks 助力印度领先即时零售平台 Zepto 构建实时洞察能力
  • 法制教育网站制作伪装网站
  • cgdb 学习笔记(GDB 图形化增强工具)
  • 广州专门做网站企业网站制作公司排名
  • .h264或.264视频文件转化成mp4视频
  • 【Python】正则表达式
  • Jenkins Pipeline中关于“\”的转义字符
  • 如何与AI有效沟通:描述问题及提示词技巧
  • 网站建设连接数据库我赢职场wordpress
  • TDengine 聚合函数 ELAPSED 用户手册
  • Android音频学习(二十)——高通HAL
  • C#练习题——Lambad表达式的应用
  • Polar WEB(1-20)
  • 湖州做网站公司哪家好温州市网站制作公司
  • NW973NW976美光固态闪存NW982NW987
  • 软件测试 - 接口测试(中篇)
  • 项目进不了index.php,访问public下的html文件可以进去
  • 得力D31系列M2500 M3100 ADNW激光打印机维修手册
  • 信誉好的东莞网站推广从网站验证码谈用户体验
  • Spring Boot中Bean Validation的groups属性深度解析
  • Linux进程(2)
  • C++:String类
  • 金华网站开发杭州自适应网站建设