题目传送门

这么经典的题目,还是看了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

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 100090
#define maxm 500090 using namespace std; int n,m,totp,totn,ans;
int headp[maxn],headn[maxn],val[maxn],f[maxn],d[maxn],vis[maxn];
struct node{
int to,next;
};
node edge_posi[maxm*],edge_nega[maxm*]; void add_posi(int x,int y)
{
edge_posi[++totp].to=y;
edge_posi[totp].next=headp[x];
headp[x]=totp;
} void add_nega(int x,int y)
{
edge_nega[++totn].to=y;
edge_nega[totn].next=headn[x];
headn[x]=totn;
} void spfa_posi()
{
queue<int>q;
memset(d,0x3f,sizeof(d));
q.push();d[]=val[];vis[]=;
while(!q.empty())
{
int x=q.front();
q.pop();vis[x]=;
for(int i=headp[x];i;i=edge_posi[i].next)
{
int y=edge_posi[i].to;
if(min(d[x],val[y])<d[y])
{
d[y]=min(d[x],val[y]);
if(!vis[y]) q.push(y),vis[y]=;
}
}
}
} void spfa_nega()
{
queue<int>q;
memset(vis,,sizeof(vis));
memset(f,,sizeof(f));
q.push(n);d[n]=val[n];vis[n]=;
while(!q.empty())
{
int x=q.front();
q.pop();vis[x]=;
for(int i=headn[x];i;i=edge_nega[i].next)
{
int y=edge_nega[i].to;
if(max(f[x],val[y])>f[y])
{
f[y]=max(f[x],val[y]);
if(!vis[y]) q.push(y),vis[y]=;
}
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&val[i]);
for(int i=;i<=m;i++)
{
int x=,y=,opt=;
scanf("%d%d%d",&x,&y,&opt);
if(opt==)
{
add_posi(x,y);
add_nega(y,x);
}
else if(opt==)
{
add_posi(x,y);add_posi(y,x);
add_nega(y,x);add_nega(x,y);
}
}
spfa_posi();
spfa_nega();
for(int i=;i<=n;i++)
ans=max(ans,f[i]-d[i]);
printf("%d",ans);
return ;
}

建反图的思想妙啊!

Luogu P1073 最优贸易【最短路/建反图】 By cellur925的更多相关文章

  1. Luogu P1073 最优贸易(最短路)

    P1073 最优贸易 题意 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有 ...

  2. 洛谷 P1073 最优贸易 最短路+SPFA算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...

  3. Luogu P1073 最优贸易

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

  4. LuoguP1342请柬 【最短路/建反图】By cellur925

    题目传送门 开始就想直接正向跑一遍Dij把到各点的最短路加起来即可,后来发现与样例少了些,于是再读题发现需要也求出学生们回来的最短路. 但是注意到本题是有向图,如果是无向图就好说. 那么我们怎么解决? ...

  5. 【luogu P1073 最优贸易】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1073 对于状态量相互影响的题目,分层图是个不错的想法. 考虑在题目中分为: 不交易: 直接从1到n出去,为0 ...

  6. [NOIp2009] luogu P1073 最优贸易

    md 我发现跟你们聊天贼没意思. 题目描述 我觉得描述挺好,不改了吧. Solution 容易发现这是道 dfs + DP 的乱搞题. 设 f[x]f[x]f[x] 表示到 xxx 这个点的最优答案. ...

  7. 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)

    传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...

  8. P1073 最优贸易 建立分层图 + spfa

    P1073 最优贸易:https://www.luogu.org/problemnew/show/P1073 题意: 有n个城市,每个城市对A商品有不同的定价,问从1号城市走到n号城市可以最多赚多少差 ...

  9. 洛谷 P1073 最优贸易 解题报告

    P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...

随机推荐

  1. Two Sum(hashtable)

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  2. [Bzoj1821][JSOI2010]Group 部落划分 Group(并查集)(二分答案)

    1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2949  Solved: 1392[S ...

  3. hp 88a加粉

    http://v.youku.com/v_show/id_XNzEzODEwNzMy.html

  4. SYSTEM 表空间管理及备份恢复

    标签: systemoraclesqldatabasefile数据库 2010-11-28 18:14 12689人阅读 评论(0) 收藏 举报 分类: -----Oracle备份恢复(16) 版权声 ...

  5. 【转】AOP

    原文:http://blog.csdn.net/zhoudaxia/article/details/38502347 .---------------------------------------- ...

  6. Direct Buffer vs. Heap Buffer

    1. 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高. 2. 差别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAV ...

  7. android 开发中用到的工具-持续更新(码农必看)

    1. vim 单文件查看改动利器(一直使用支持各种编码各种文件,各种插件),欢迎下载笔者插件 git clone https://github.com/green130181/vim-conf.git ...

  8. 【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 一 ...

  9. Redis入门教程(二)— 基本数据类型

    阅读以下内容时,手边打开一个redis-cli一起输入,输入命令敲击回车键前在心中想好你的答案,如果结果不合你的预期,请分析原因,使极大地提高学习效率.如果没有条件,每个数据类型后有代码运行结果,供你 ...

  10. FileWriter简单用法并记录日志

    import java.io.*; import java.util.Date; /** * Created by Administrator on 2018/4/6. */ public class ...