题目传送门

这么经典的题目,还是看了lyd的题解....唉难过。

一句话题意:在一张点有全都的图上找一条从1到n的路径,存在两个点p,q(p<q),使val[q]-val[p]最大。

给出的图是既有双向又有单向的混合图,考虑像普通的方法一样建图。除此之外,再在一个新邻接表中建原图的反图(边方向相反)。

为什么要这样做?

考虑分别自起点到终点和自终点到起点遍历,计算出f[]和d[],其中f[i]表示从1到i的路径中经过的最小的点权,d[i]表示从n到i的路径中经过的最大点权。(想一想,为什么?)

于是我们就可以枚举断点X,使d[x]-f[x]最大。保证了1能走到n,即路径的连贯(联通)性。

code

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 #define maxn 100090
 6 #define maxm 500090
 7
 8 using namespace std;
 9
10 int n,m,totp,totn,ans;
11 int headp[maxn],headn[maxn],val[maxn],f[maxn],d[maxn],vis[maxn];
12 struct node{
13     int to,next;
14 };
15 node edge_posi[maxm*4],edge_nega[maxm*4];
16
17 void add_posi(int x,int y)
18 {
19     edge_posi[++totp].to=y;
20     edge_posi[totp].next=headp[x];
21     headp[x]=totp;
22 }
23
24 void add_nega(int x,int y)
25 {
26     edge_nega[++totn].to=y;
27     edge_nega[totn].next=headn[x];
28     headn[x]=totn;
29 }
30
31 void spfa_posi()
32 {
33     queue<int>q;
34     memset(d,0x3f,sizeof(d));
35     q.push(1);d[1]=val[1];vis[1]=1;
36     while(!q.empty())
37     {
38         int x=q.front();
39         q.pop();vis[x]=0;
40         for(int i=headp[x];i;i=edge_posi[i].next)
41         {
42             int y=edge_posi[i].to;
43             if(min(d[x],val[y])<d[y])
44             {
45                 d[y]=min(d[x],val[y]);
46                 if(!vis[y]) q.push(y),vis[y]=1;
47             }
48         }
49     }
50 }
51
52 void spfa_nega()
53 {
54     queue<int>q;
55     memset(vis,0,sizeof(vis));
56     memset(f,128,sizeof(f));
57     q.push(n);d[n]=val[n];vis[n]=1;
58     while(!q.empty())
59     {
60         int x=q.front();
61         q.pop();vis[x]=0;
62         for(int i=headn[x];i;i=edge_nega[i].next)
63         {
64             int y=edge_nega[i].to;
65             if(max(f[x],val[y])>f[y])
66             {
67                 f[y]=max(f[x],val[y]);
68                 if(!vis[y]) q.push(y),vis[y]=1;
69             }
70         }
71     }
72 }
73
74 int main()
75 {
76     scanf("%d%d",&n,&m);
77     for(int i=1;i<=n;i++) scanf("%d",&val[i]);
78     for(int i=1;i<=m;i++)
79     {
80         int x=0,y=0,opt=0;
81         scanf("%d%d%d",&x,&y,&opt);
82         if(opt==1)
83         {
84             add_posi(x,y);
85             add_nega(y,x);
86         }
87         else if(opt==2)
88         {
89             add_posi(x,y);add_posi(y,x);
90             add_nega(y,x);add_nega(x,y);
91         }
92     }
93     spfa_posi();
94     spfa_nega();
95     for(int i=1;i<=n;i++)
96         ans=max(ans,f[i]-d[i]);
97     printf("%d",ans);
98     return 0;
99 }

View Code

建反图的思想妙啊!

转载于:https://www.cnblogs.com/nopartyfoucaodong/p/9478581.html

Luogu P1073 最优贸易【最短路/建反图】 By cellur925相关推荐

  1. Luogu P1073 最优贸易(NOIp提高组 2009)分层图最短路写法

    注意不要用Dijkstra! 注意不要用Dijkstra!! 注意不要用Dijkstra!!! 因为有负权边 #include<cstdio> #include<queue> ...

  2. 洛谷 P1073 最优贸易 (分层图状态转移+SPFA,求最长路径;另附某dalao的超短代码:暴力+动规)

    题目链接1 题目链接2 另附某dalao的超短代码:暴力+动规 P1073 最优贸易 题目描述 C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市. 任意两个城市之间最多只有 ...

  3. Invitation Cards(建反图 + 跑两遍SPFA)

    题目如下: In the age of television, not many people attend theater performances. Antique Comedians of Ma ...

  4. Codeforces Round #588 (Div. 2) F. Konrad and Company Evaluation 图论 + 建反图 好题

    传送门 文章目录 题意: 思路: 题意: 给你一张nnn个点mmm条边的图,其中每个点iii初始编号为iii,边是有向的,方向为从编号大的指向编号小的.定义一个贡献为存在某三个点a,b,ca,b,ca ...

  5. 洛谷P1073最优贸易——双向取值

    题目:https://www.luogu.org/problemnew/show/P1073 由于任何城市都可以多次经过,所以可以随便走,也就不用太在意有向边和无向边,把无向边当做两条有向边处理: 根 ...

  6. 洛谷P1073 最优贸易

    反向建图+dijkstra 切一道老题水水... 题目的意思是让我们找到两个点x,y,使得差值最大. 所以我们先在正向图跑dijkstra,用d数组表示从起点到i点的最少价值,所以可以用d[i]=mi ...

  7. 洛谷 P1073 最优贸易

    题目描述 CC C 国有 n n n 个大城市和 m mm 条道路,每条道路连接这 nnn 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路 ...

  8. [NOIP2009] 最优贸易 (最短路,分层图)

    题目链接 Solution 分层图+\(SPFA\). 建立3层图,其中每一层之中的边权赋为0. 对于任意一条边 \(t\) ,其起点 \(x\) 和终点 \(y\). 我们将 \(x\) 在第一层的 ...

  9. 洛谷:P3243 [HNOI2015]菜肴制作(拓扑序列、建反图、贪心)

    美食家老嗨 题意: 很容易读偏,以为是求满足限制下的最小字典序. 要求是在满足所有限制后,优先做 1,此外优先做 2 - -- 摘自xyz32768 C o d e : Code: Code: #in ...

最新文章

  1. tomcat通过conf-Catalina-localhost目录发布项目详解
  2. linkedin databus介绍——监听数据库变化,有新数据到来时通知其他消费者app,新数据存在内存里,多份快照...
  3. nacos 环境切换_Nacos多环境配置
  4. qtableview设置单元格颜色_一键解锁Excel自定义单元格格式!
  5. qq显示服务器连接中0x9a,打开QQ出现0x00008819错误代码的解决方法
  6. php的优化参数有哪些,php 参数优化
  7. 【flink】Flink 使用IntelliJ IDEA 进行远程调试代码
  8. 腾讯优图 ncnn AI 框架宣布加入 ONNX 开放生态系统
  9. excel利用公式获取行或列中最后一个非空单元格数据
  10. HTML常用标签(三)
  11. 百度图片爬虫【图片编码处理】
  12. Android后台耗电分析及优化
  13. 2021-02-23
  14. 中国染料医用激光器行业市场供需与战略研究报告
  15. 性能提升利器之固态硬盘和序列化漫谈
  16. MySQL字段名获取
  17. html实现波浪,纯CSS实现波浪移动效果的示例
  18. 您如何用leetcode进行面试很不好
  19. deployment的yaml说明
  20. UG二次开发GRIP给尺寸增加*

热门文章

  1. docker 删除默认连接_Net Core 中 Docker应用
  2. python如何编程-怎么用手机编写Python程序?
  3. python基本使用-python基本用法
  4. python心得体会-终于懂得python基础学习心得
  5. python菜鸟基础教程-终于懂得python入门菜鸟教程
  6. 下面不属于python第三方库的安装方法的是-Python第三方库安装和卸载
  7. python装饰器-python装饰器简介---这一篇也许就够了(推荐)
  8. python语言程序设计书-清华大学出版社-图书详情-《Python语言程序设计》
  9. monty python-Monty Python
  10. python pip-python之pip的使用