Vijos1754 最优贸易(SPFA)

原创 2018年04月16日 20:38:45

题意分析

反向建图的思想应该是很常见的。
一开始一直在想直接做一次SPFA求出结果,发现一直无法维护找到的最大最小值和能够更新的先后关系。后来看了一下题解才明白怎么回事。

首先正向建图,因为一开始是没有购买水晶球的,首先应该找一个地方购买水晶球,按照贪心的思想,希望购买到的水晶球的价钱尽量低。这时候做SPFA,意义为找到从起点开始能到达的点,其能买到水晶球最便宜的价格为多少。
SPFA的过程也不难,松弛的条件为,如果下一个节点的最小值比当前点最小值小,即做松弛。 注意松弛的时候应该将下一个节点的值更新为 min(当前节点的值,下一个节点的值),才能保证下一个节点的值为最小。

然后反向见图。 反向见图的含义是,如果我买到了水晶球,从哪卖出去能够获得最大收益。还是按照贪心的思想,希望卖出的水晶球的价格越高越好,SPFA过程维护的是,从终点开始能够到达的点,其能卖出水晶球的最贵的价格为多少。
SPFA的过程松弛条件与刚才相反,遇到更大的就松弛。

结果为所有点对应的卖出与买入的差值最大值,遍历求出即可。

代码总览

#include<bits/stdc++.h>
using namespace std;
const int nmax = 500005;
const int mmax = 100005;
typedef struct{
    int to,nxt;
} Edge;
Edge e[nmax<<1], e2[nmax<<1];
int a[mmax],head[nmax<<1],head2[nmax<<1];
int p[mmax],p2[mmax];
int n,m,tot = 0,tot2 = 0;
void add(int u,int v){
    e[tot].to = v;
    e[tot].nxt = head[u];
    head[u] = tot++;
}
void add2(int u,int v){
    e2[tot2].to = v;
    e2[tot2].nxt = head2[u];
    head2[u] = tot2++;
}
void spfa(){
    memset(p,0x3f3f3f3f,sizeof p); p[1] = a[1];
    bitset<mmax> inque; inque.reset();
    queue<int> q; q.push(1);
    while(!q.empty()){
        int u = q.front(); q.pop(); inque.reset(u);
        for(int i = head[u]; i!=-1; i=e[i].nxt){
            int v = e[i].to;
            if(p[v] > p[u]){
                p[v] = min(p[u],a[v]);
                if(!inque.test(v)){
                    q.push(v);
                    inque.set(v);
                }
            }
        }
    }
}
void spfa2(){
    memset(p2,-1,sizeof p2); p2[n] = a[n];
    bitset<mmax> inque; inque.reset();
    queue<int> q; q.push(n);
    while(!q.empty()){
        int u = q.front(); q.pop(); inque.reset(u);
        for(int i = head2[u]; i!=-1; i=e2[i].nxt){
            int v = e2[i].to;
            if(p2[v] < p2[u]){
                p2[v] = max(p2[u],a[v]);
                if(!inque.test(v)) {
                    q.push(v);
                    inque.set(v);
                }
            }
        }
    }
}
int main(){
    memset(head,-1,sizeof head);
    memset(head2,-1,sizeof head2);
    scanf("%d %d",&n,&m);
    for(int i = 1;i<=n;++i) scanf("%d",&a[i]);
    int u,v,w;
    for(int i = 1;i<=m;++i) {
        scanf("%d %d %d",&u,&v,&w);
        if(w == 1){add(u,v) ; add2(v,u);}
        else {add(u,v);add(v,u);add2(u,v);add2(v,u);}
    }
    spfa();
    spfa2();
    int ans = 0;
    for(int i = 1;i<=n;++i)
        if(p[i]!=0x3f3f3f3f && p2[i]!=-1 && p2[i] - p[i] > ans) ans = p2[i] - p[i];
    printf("%d\n",ans);
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pengwill97/article/details/79966119

html5的app开发

课程讲解了html5手机游戏开发 1.写个简单html5 游戏 2.创建android应用打包html5 3.实现android与html5的通信 4 接入充值
  • 2017年03月29日 14:05

【NOIP2009】最优贸易 spfa

CODEVS:http://codevs.cn/problem/1173/ 题目描述 Description 【问题描述】 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城...
  • Qantun_Mechanics
  • Qantun_Mechanics
  • 2016-04-28 00:01:24
  • 2582

spfa-洛谷P1073 最优贸易

https://daniu.luogu.org/problem/show?pid=1073#sub 显然这道题目你只要找到任何路径上的最大值,最小值就好了; 那么对于点k 我们要知道1~k里面的...
  • largecub233
  • largecub233
  • 2017-04-01 11:29:21
  • 531

洛谷 1073 最优贸易 NOIP2009T3 SPFA

NOIP2009 T3 神奇题目 SPFA
  • ctsnevermore
  • ctsnevermore
  • 2016-11-12 20:24:11
  • 439

Vijos1754 最优贸易

题目大意:给定一张有向图,求从起点到终点最大值与最小值的差值(这么说还不准确,下文有解释)的最大值。 思路:可以tarjan+DP,不过SPFA是可以解决的。由于只能先买入再卖出,因此要先正向spfa...
  • Little_Flower_0
  • Little_Flower_0
  • 2015-10-16 08:10:17
  • 603

NOIP2009最优贸易——史上最详细解析

C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计...
  • yangs_s
  • yangs_s
  • 2015-08-07 11:59:40
  • 4644

code vs 1173 最优贸易 (spfa)

1173 最优贸易   2009年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond ...
  • clover_hxy
  • clover_hxy
  • 2016-09-10 07:58:20
  • 283

【noip2009】最优贸易 tarjan+拓扑+dp或spfa

描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。任意两个 城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路,一部分 ...
  • u011327397
  • u011327397
  • 2016-10-08 21:02:51
  • 373

Codevs_P1173 最优贸易(SPFA)

2009年NOIP全国联赛提高组 题目描述 Description 【问题描述】 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市。任意两个 城市之间最多只有一条道路直...
  • qq_18455665
  • qq_18455665
  • 2015-12-15 20:41:38
  • 515

[NOIP2009]最优贸易(spfa)

You're worried about your destiny? Then write a new one.
  • Clove_unique
  • Clove_unique
  • 2016-09-18 18:50:09
  • 595
收藏助手
不良信息举报
您举报文章:Vijos1754 最优贸易(SPFA)
举报原因:
原因补充:

(最多只允许输入30个字)