首页 > 其他分享 >P1073 [NOIP2009 提高组] 最优贸易 分层图

P1073 [NOIP2009 提高组] 最优贸易 分层图

时间:2023-01-08 18:34:30浏览次数:44  
标签:int NOIP2009 back 分层 mp push first P1073 dis

//题意:给出有向图,有环(SCC),每个节点有一个 商品值 ,小明想从1点走向n点,同时想要进行一次贸易,即从路线上某个点买入商品, 又在某个节点卖出, 询问最大收益是多少(如果收益为负数那么输出0)
//思路:其实环对做题造成的影响,本质上可以归结于对单线形逻辑结构的破坏(有点dp中无后效性的意味)
//      https://blog.csdn.net/You_are_hanson/article/details/125932502
//      这篇博客讲得很好,其实对于消除环带来的影响,在这题中分层图也能实现
//      因为将 未操作 买进 卖出 这三种状态分开的话,层内的点是无法对层内的点做出贡献的,因为只有实现状态的跨越才能使得值变化
//      所以层内的环是无意义的,我们只需要保证层内一个点只经过一次就不用担心环的问题
//      同时分成三层后,三层之间是一个单线性无环的逻辑关系,所以这就变成了用spafa跑最长路了
//
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m;
vector<pair<int, int>> mp[3 * N];
int dis[3 * N], cnt, stp;
bool b[3 * N];
queue<int> lis;
void bellman_ford(int a) {
    memset(b, false, sizeof(b));
    for (int i = 1; i <= n; i++) dis[i] = dis[i + N] = dis[i + 2 * N] = INT_MIN;//这里很妙,因为层内的所有边权为0,所以将每个点的权值初始化为极小值可以保证至多经过层内的点一次
    
    dis[a] = 0;
    lis.push(a);
    b[a] = true;
    while (!lis.empty()) {
        int x = lis.front();
        lis.pop();
        b[x] = false;
        for (auto y : mp[x]) {
            if (dis[x] + y.second > dis[y.first]) {
                dis[y.first] = dis[x] + y.second;
                if (!b[y.first])
                    lis.push(y.first);
                b[y.first] = true;
            }
        }
    }
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int a; cin >> a;
        mp[i].push_back({ i + N,-a });
        mp[i + N].push_back({ i + 2 * N,a });
    }//建层与层之间的边
    for (int i = 1; i <= m; i++) {
        int a, b, od; cin >> a >> b >> od;
        mp[a].push_back({ b,0 });
        mp[a + N].push_back({ b + N,0 });
        mp[a + 2 * N].push_back({ b + 2 * N,0 });
        if (od == 2) {
            mp[b].push_back({ a,0 });
            mp[b + N].push_back({ a + N,0 });
            mp[b + 2 * N].push_back({ a + 2 * N,0 });
        }
    }//建层内边
    bellman_ford(1);
    cout << ((dis[n + 2 * N] > 0) ? dis[n + 2 * N] : 0);
    return 0;
}

 

标签:int,NOIP2009,back,分层,mp,push,first,P1073,dis
From: https://www.cnblogs.com/Aacaod/p/17035062.html

相关文章

  • P1073 [NOIP2009 提高组] 最优贸易 强联通分量+缩点
    //题意:给出有向图,有环(SCC),每个节点有一个商品值,小明想从1点走向n点,同时想要进行一次贸易,即从路线上某个点买入商品,又在某个节点卖出,询问最大收益是多少(如果收益为负数......
  • [Docker] 将容器打包成镜像、镜像分层机制详解
    目录commit命令创建一个容器打包镜像联合文件系统联合文件系统实践前置准备不使用联合文件系统的挂载使用联合文件系统进行挂载写时复制机制commit命令#将容器打包成......
  • NC16611 [NOIP2009]最优贸易
    题目链接题目题目描述C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这m条道路中有一部分为单向通行的道......
  • 【架构设计】你的应用该如何分层呢?
    前言最近review公司的代码,发现现在整个代码层级十分混乱,一个service类的长度甚至达到了5000多行。而且各种分层模型DTO、VO乱用,最终出现逻辑不清晰、各模块相互依赖、代......
  • 关于递归Collapse 折叠面板和实现分层折叠互斥效果
    近期要用Collapse折叠面板实现一个递归效果,直接上效果图,实现最终效果是每一层的内容互斥,组件递归的的时候为了实现每一层内容互斥要给每一个el-collapse加上一个v-model,......
  • autosar分层架构
    AUTOSAR分层一、应用层:通过端口(PORT)交互,每个SWC可以包含一个或者多个实体(RunnableEntity),可由RTE事件触发。原子SWC包括应用软件SWC,传感器SWC,ECU抽象软件SWC等......
  • 常见大型 Web 项目分层
    常见大型Web项目分层流行的Web框架大多数是MVC框架,MVC这个概念最早由TrygveReenskaug在1978年提出,为了能够对GUI类型的应用进行方便扩展,将程序划分为:控制器(Controlle......
  • 当Pytest遇上MVC分层设计自动化用例就该这么写
    引子数据写在代码里,追求快速编写用例,是我设计tep的一个特点,这在个人编写时是一种非常良好的体验。但相比于HttpRunner、JMeter等来说,总觉得还差点意思。思考良久,总结为三......
  • [NOIP2009 普及组] 多项式输出
    [NOIP2009普及组]多项式输出题目描述一元$n$次多项式可用如下的表达式表示:$$f(x)=a_nxn+a_{n-1}x{n-1}+\cdots+a_1x+a_0,a_n\ne0$$其中,$a_ix^i$称为$i$次项,$a......
  • 测试分层的优势有哪些-软件测试知识
    在测试设计时最主要依据的就是测试金字塔的测试结构。如果在项目临近发布才开始测试并发现缺陷,这样修复缺陷的成本就会很高,项目的进度也会很不确定。所以,就开发阶段来......