首页 > 其他分享 >洛谷P1073 最优贸易 (分层图)

洛谷P1073 最优贸易 (分层图)

时间:2024-07-10 12:07:52浏览次数:16  
标签:洛谷 int 题解 spfa vis 分层 P1073 dis

题意:多个节点,起点到终点,每个点可以买或卖水晶球,每个点水晶球的价格不一样(买卖价格相同)。问最多买卖一次,能赚取最高多少差价?(在赚不到差价的情况下他就无需进行贸易)。

思路:“这个'b'题,我不看题解我是想不出来,但是确实是个很好的题”。有两种做法,双向spfa和分层图,我就只说分层图做法(另一个也不会)。
分层图是多层,每层代表了不同的状态。这里有3层。

一层之间权值都=0,一层到二层是买入,二层到三层是卖出。
分层图就是存图麻烦,然后就是正常跑一个spfa(spfa是能处理负边的,具有伸缩,dij是不能的)就可以了。题解注释的那一块是输出存的题,不懂了是如何存图的,可以输出看看,会是这样:

题解:

点击查看代码
//S 分层图
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+9;
int n,m,U,V,T,c;
vector<int>dis(N,-INT64_MAX),vis(N,0);//与dij的vis不同,此vis是判断节点i是否在队列中.
// 这里是spfa找到终点最大值,dis数组要初始化极小值。
vector<pair<int,int>>G[N];//first:点 second:权值

void spfa(){
    queue<int>q;
    q.push(1);
     dis[1]=0;
      while(!q.empty()){
          int u=q.front();
           q.pop();
            vis[u]=0;
             for(auto [x,y]:G[u]){//u-->x
                 if(dis[x]<dis[u]+y){//比较是否有更大值
                     dis[x]=dis[u]+y;
                      if(!vis[x]){
                          q.push(x),vis[x]=1;
                      }
                 }
             }
      }
}

signed main()
{
    scanf("%lld%lld",&n,&m);
    int n2=n*2;
    for(int i=1;i<=n;i++){//层与层之间只能单向图
        scanf("%lld",&c);
        G[i].push_back({n+i,-c});//一层
        G[n+i].push_back({n2+i,c});//二层
    }


    for(int i=1;i<=m;i++){
        scanf("%lld%lld%lld",&U,&V,&T);
        G[U].push_back({V,0});
        G[n+U].push_back({n+V,0});
        G[n2+U].push_back({n2+V,0});
        if(T==2){//双向图
            G[V].push_back({U,0});
            G[n+V].push_back({n+U,0});
            G[n2+V].push_back({n2+U,0});
        }
    }

//     for(int i=1;i<=3*n;i++){
//         cout<<i<<":";
//          for(auto x:G[i]){
//              cout<<x.first<<","<<x.second<<";";
//          }
//           cout<<endl;
//     }

      spfa();
      printf("%lld\n",dis[3*n]);
    return 0;
}

标签:洛谷,int,题解,spfa,vis,分层,P1073,dis
From: https://www.cnblogs.com/yongchaoD/p/18293791

相关文章

  • 洛谷 P1853 投资的最大效益 蒟蒻题解
    洛谷P1853投资的最大效益蒟蒻题解题目背景约翰先生获得了一大笔遗产,他暂时还用不上这一笔钱,他决定进行投资以获得更大的效益。银行工作人员向他提供了多种债券,每一种债券都能在固定的投资后,提供稳定的年利息。当然,每一种债券的投资额是不同的,一般来说,投资越大,收益也越大,而......
  • 洛谷P5594 【XR-4】模拟赛C语言
    #include<stdio.h>intmain(){ intn,m,k; inti,j; inth,l; scanf("%d%d%d",&n,&m,&k); intarr[n+1][m+1]; intday[k+1]; for(i=1;i<=n;i++){//录入数据 for(j=1;j<=m;j++){ scanf("%d&quo......
  • 洛谷P1014Cantor 表 C语言
    #include<stdio.h>intmain(){intinput;inth,k;inti,sum=0;scanf("%d",&input);for(i=1;;i++){sum+=i;//求出input数在那个范围内,i就是行数,sum就是所有行加起来数的个数if(sum>=input){h=......
  • 洛谷P1308 [NOIP2011 普及组] 统计单词数C语言
    #include<stdio.h>#include<string.h>#include<ctype.h>intmain(){charcheck[11];charstr[1000001];intf_num=0;intcount=0;inti=0;intj=0;intp=1;gets(check);gets(str);......
  • kafka分层存储解读
    分层存储的目标是根据数据的特性和组织的策略,将数据放在最合适的存储介质上,从而优化存储资源的使用,平衡性能和成本。怎么进行分层存储:可以根据分析使用模式、访问频率和其他因素的策略和算法,自动在这些层之间放置和移动数据。这确保了最关键和频繁访问的数据驻留在高性能存储中......
  • 洛谷 P6464 [传智杯 #2 决赛] 传送门
    通过便利每两个点之间的传送门,再便利一次其他点与传送点的路长度,没路的情况是最大值不会考虑,有路就取经过传送门和原本最短路的最小值/*台州第一深情*/include<bits/stdc++.h>usingnamespacestd;usingi64=long;usingll=longlong;typedefpair<int,int>PII;co......
  • 题解:洛谷 P1890 gcd区间
    题解:洛谷P1890gcd区间标签:线段树,st表,分块,dp题意给定数列\(a\),有\(m\)次询问求区间\([l,r]\)的最大公约数。思路这道题有多种写法,如标签所示。线段树线段树可以维护具有结合性的操作,很明显\(\gcd\)满足。这道题线段树跑的慢是因为无修改操作,自然没有其他\(O(1)......
  • 题解:洛谷 P2678 [NOIP2015 提高组] 跳石头
    题解:洛谷P2678[NOIP2015提高组]跳石头标签:二分,贪心题意给定一个数列,\(a_0=0,a_{N+1}=L\),从其中删除不超过\(M\)个数,使得\(a_i-a_{i-1}\)的最小值最大。思路从最小值最大不难想到二分答案。统计\(a_i-a_j<mid\)的数量\(k\),如果不满足的话说明不删,\(j\getsi\)。......
  • 题解:洛谷 P1843 奶牛晒衣服
    题解:洛谷P1843奶牛晒衣服标签:二分,贪心题意给定一个数列,每秒可以将所有数减\(a\),也可以选择一个数减\(b\),二者可同时进行,求让所有数小于等于\(0\)的最小秒数。思路要求最小的秒数,也就是刚好所有数字小于等于\(0\),且尽量大。这个秒数具有单调性,考虑二分答案。二分的......
  • libaom 编码器实验 AV1 标准 SVC 分层编码
    SVC编码视频SVC编码,即ScalableVideoCoding(可适性视讯编码或可分级视频编码),是H.264/MPEG-4AVC编码的一种扩展,它提供了更大的编码弹性,并且具有时间可适性(TemporalScalability)、空间可适性(SpatialScalability)及讯杂比(质量)可适性(SNRScalability)三大特性。这种编码方式允......