Luogu P1073 最优贸易【最短路/建反图】 By cellur925
题目传送门
这么经典的题目,还是看了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相关推荐
- Luogu P1073 最优贸易(NOIp提高组 2009)分层图最短路写法
注意不要用Dijkstra! 注意不要用Dijkstra!! 注意不要用Dijkstra!!! 因为有负权边 #include<cstdio> #include<queue> ...
- 洛谷 P1073 最优贸易 (分层图状态转移+SPFA,求最长路径;另附某dalao的超短代码:暴力+动规)
题目链接1 题目链接2 另附某dalao的超短代码:暴力+动规 P1073 最优贸易 题目描述 C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市. 任意两个城市之间最多只有 ...
- Invitation Cards(建反图 + 跑两遍SPFA)
题目如下: In the age of television, not many people attend theater performances. Antique Comedians of Ma ...
- Codeforces Round #588 (Div. 2) F. Konrad and Company Evaluation 图论 + 建反图 好题
传送门 文章目录 题意: 思路: 题意: 给你一张nnn个点mmm条边的图,其中每个点iii初始编号为iii,边是有向的,方向为从编号大的指向编号小的.定义一个贡献为存在某三个点a,b,ca,b,ca ...
- 洛谷P1073最优贸易——双向取值
题目:https://www.luogu.org/problemnew/show/P1073 由于任何城市都可以多次经过,所以可以随便走,也就不用太在意有向边和无向边,把无向边当做两条有向边处理: 根 ...
- 洛谷P1073 最优贸易
反向建图+dijkstra 切一道老题水水... 题目的意思是让我们找到两个点x,y,使得差值最大. 所以我们先在正向图跑dijkstra,用d数组表示从起点到i点的最少价值,所以可以用d[i]=mi ...
- 洛谷 P1073 最优贸易
题目描述 CC C 国有 n n n 个大城市和 m mm 条道路,每条道路连接这 nnn 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路 ...
- [NOIP2009] 最优贸易 (最短路,分层图)
题目链接 Solution 分层图+\(SPFA\). 建立3层图,其中每一层之中的边权赋为0. 对于任意一条边 \(t\) ,其起点 \(x\) 和终点 \(y\). 我们将 \(x\) 在第一层的 ...
- 洛谷:P3243 [HNOI2015]菜肴制作(拓扑序列、建反图、贪心)
美食家老嗨 题意: 很容易读偏,以为是求满足限制下的最小字典序. 要求是在满足所有限制后,优先做 1,此外优先做 2 - -- 摘自xyz32768 C o d e : Code: Code: #in ...
最新文章
- tomcat通过conf-Catalina-localhost目录发布项目详解
- linkedin databus介绍——监听数据库变化,有新数据到来时通知其他消费者app,新数据存在内存里,多份快照...
- nacos 环境切换_Nacos多环境配置
- qtableview设置单元格颜色_一键解锁Excel自定义单元格格式!
- qq显示服务器连接中0x9a,打开QQ出现0x00008819错误代码的解决方法
- php的优化参数有哪些,php 参数优化
- 【flink】Flink 使用IntelliJ IDEA 进行远程调试代码
- 腾讯优图 ncnn AI 框架宣布加入 ONNX 开放生态系统
- excel利用公式获取行或列中最后一个非空单元格数据
- HTML常用标签(三)
- 百度图片爬虫【图片编码处理】
- Android后台耗电分析及优化
- 2021-02-23
- 中国染料医用激光器行业市场供需与战略研究报告
- 性能提升利器之固态硬盘和序列化漫谈
- MySQL字段名获取
- html实现波浪,纯CSS实现波浪移动效果的示例
- 您如何用leetcode进行面试很不好
- deployment的yaml说明
- UG二次开发GRIP给尺寸增加*
热门文章
- docker 删除默认连接_Net Core 中 Docker应用
- python如何编程-怎么用手机编写Python程序?
- python基本使用-python基本用法
- python心得体会-终于懂得python基础学习心得
- python菜鸟基础教程-终于懂得python入门菜鸟教程
- 下面不属于python第三方库的安装方法的是-Python第三方库安装和卸载
- python装饰器-python装饰器简介---这一篇也许就够了(推荐)
- python语言程序设计书-清华大学出版社-图书详情-《Python语言程序设计》
- monty python-Monty Python
- python pip-python之pip的使用