【NOIP2009提高组】最优贸易

https://www.luogu.org/problem/show?pid=1073

如果他想在i点卖出,那么就要在从1点出发到i点的路径里找个最便宜的买入,用Bellman-Ford求出这样最便宜的买入价记为minp[i]。他能获得的利润就是price[i]-minp[i]。

但是并不是可以在所有的点都可以卖出,因为他最终要走到N,所以只有在和N联通的点才能卖出。用从N点出发倒着的DFS/BFS记录点i是否能到达N点。

故答案为max{price[i]-minp[i] (i点与N点联通)}

#include <iostream>
#include <vector>
#include <queue>
#define maxn 100005
using namespace std;
const int inf = 10000;
int n, m, price[maxn];
vector<int> g[maxn], gt[maxn];

int minp[maxn];
bool inque[maxn];
queue<int> q;
void bellman_ford()
{
    for (int i = 1; i <= n; i++)
        minp[i] = inf;
    minp[1] = price[1];
    q.push(1);
    inque[1] = true;
    while (!q.empty())
    {
        int v = q.front();
        q.pop();
        inque[v] = false;
        for (int i = 0; i < g[v].size(); i++)
        {
            int w = g[v][i];
            if (minp[w] > min(minp[v], price[w]))
            {
                minp[w] = min(minp[v], price[w]);
                if (!inque[w])
                {
                    inque[w] = true;
                    q.push(w);
                }
            }
        }
    }
}

bool avai[maxn];
void dfs(int v)
{
    avai[v] = true;
    for (int i = 0; i < gt[v].size(); i++)
    {
        int w = gt[v][i];
        if (!avai[w])
            dfs(w);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> price[i];
    int u, v, z;
    for (int i = 1; i <= m; i++)
    {
        cin >> u >> v >> z;
        g[u].push_back(v);
        gt[v].push_back(u);
        if (z == 2)
        {
            g[v].push_back(u);
            gt[u].push_back(v);
        }
    }

    bellman_ford();
    dfs(n);
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        if (avai[i])
            ans = max(ans, price[i] - minp[i]);
    }
    cout << ans << endl;
    return 0;
}
时间: 2024-11-03 21:38:56

【NOIP2009提高组】最优贸易的相关文章

[NOIP2009提高组]最优贸易 tarjan题解

今天刚刚学会了用tarjan写缩点(以前用两遍dfs写的),此题调了我很久,需要考虑的情况有些多,但是做出来还是挺开心的. 首先通过tarjan缩点,之后要干的事情就是计算答案. 答案有两种情况,一是在一个联通块中买进卖出,二是在一个联通块中买入,但在另外一个联通块中卖出.但是需要注意的是,以上两种情况中的联通块需要满足起点可以到达它,它也可以到达终点,并且不在一个联通块中时,买进必在卖出前. 代码中的dp(x)记录的是从起点到现在买进价最低的,每次只要用当前最大价钱减去这个值,再去和ans做比

Noip2009提高组总结

Noip2009的题目还是有一定难度的,主要是搜索和最短路都是我的弱项,不检查第一遍下来只做了150分,还是这句话,素质和读题的仔细程度决定了分数.仔细想想,我们化学老师说的话没错,或许题目你都会做,但是你在考试时犯下的各种错误终将导致你的失败,所以,提高个人编程的素样,对于我来说才是目前最重要的事. T1:潜伏者 第一题是极简单的字符串操作题,读题仔细一点,注意各种规则即可AC,但是在做的时候自己犯了一点小错误,结果只有90分,这是不应该的! + ? 1 2 3 4 5 6 7 8 9 10

noip2009提高组题解

第一题:潜伏者 模拟 注意点: 不同的密文对应的明文不同,反过来,不同的明文对应的密文也不同,我用了两个hash表来实现: 26个明文字母必须有对应的密文字母,我用了两个计数变量来判断是否26个字母都有匹配. ? 第二题:Hankson的趣味题 数论 对 a0, a1, b0, b1 四个数进行质因数分解,然后确定 x 的各质因数的指数的取值范围,运用乘法原理解决.详细分析见下: (引用自http://wenwen.sogou.com/z/q169562042.htm) Gcd(x,a0)=a1

NOIP2009提高组解题报告

前些天做了一趟noip2009提高组的题,第一次得分为285,算是达到了那年省一的线,但也充分说明了我还存在很多问题. 第一题: [问题描述] R 国和S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的R 国间谍小C 终于摸清了S 国军用密码的编码规则: 1. S 国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所 得的内容均由大写字母'A'-'Z'构成(无空格等其他字符). 2. S 国对于每个字母规定了对应的"密字".加密

[NOIP2009] 提高组 洛谷P1073 最优贸易

题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路,双向通行的道路在统计条数时也计为 1 条. C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价 格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿龙来到 C 国旅游.当他得知同一种商品在不同城市的价格可能会不同这一信息 之后,便决定在旅游的

[NOIP2009] 提高组 洛谷P1071 潜伏者

题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所得的内容均由大写字母‘A’-‘Z’构成(无空格等其他字符). 2. S 国对于每个字母规定了对应的“密字”.加密的过程就是将原信息中的所有字母替换为其对应的“密字”. 3. 每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密字”.“密字”可以

唯一分解定理的应用: NOIP2009 提高组第二题Hankson [唯一分解定理|暴力]

输入输出格式 输入格式: 第一行为一个正整数 n,表示有 n 组输入数据.接下来的 n 行每 行一组输入数据,为四个正整数 a0,a1,b0,b1,每两个整数之间用一个空格隔开.输入 数据保证 a0 能被 a1 整除,b1 能被 b0 整除. 输出格式: 输出文件 son.out 共 n 行.每组输入数据的输出结果占一行,为一个整数. 对于每组数据:若不存在这样的 x,请输出 0: 若存在这样的 x,请输出满足条件的 x 的个数: 输入输出样例 输入样例#1: 2 41 1 96 288 95

NOIP2009 提高组T3 机器翻译 解题报告-S.B.S

题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译:如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译. 假设内存中有M个单元,每单元能存放一个单词和译义.每当软件将一个新单词存入内存前,如果当前内存中已存入的单

NOIP2009最优贸易[spfa变形|tarjan 缩点 DP]

题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路,双向通行的道路在统计条数时也计为 1 条. C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价 格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿龙来到 C 国旅游.当他得知同一种商品在不同城市的价格可能会不同这一信息 之后,便决定在旅游的