题目传送门

这么经典的题目,还是看了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. zookeeper原理浅析(二)

    参考:https://www.cnblogs.com/leocook/p/zk_1.html 代码:https://github.com/littlecarzz/zookeeper 1. 数据模型 1 ...

  2. 一次使用NodeJS实现网页爬虫记

    前言 几个月之前,有同事找我要PHP CI框架写的OA系统.他跟我说,他需要学习PHP CI框架,我建议他学习大牛写的国产优秀框架QeePHP. 我上QeePHP官网,发现官方网站打不开了,GOOGL ...

  3. http返回写入问题

    1.服务器返回写的数据全是通过response对象,response.getWriter().print(msg);这样就返回写出数据了. 比如: logger.info("encrypte ...

  4. Enhance Magento 404 page

    Magento default installation already has a predefined custom 404 page (no-route). But is it enough t ...

  5. Cubieboard搭建Hadoop指南

    1.刷固件 出厂的Cubieboard是Android系统,需要Linux系统安装Hadoop,到此网址下载: http://dl.cubieboard.org/software/a20-cubiet ...

  6. cf246 ENew Reform (并查集找环)

    Berland has n cities connected by m bidirectional roads. No road connects a city to itself, and each ...

  7. php验证邮箱

    <?php if(isset($_POST['email'])){ $email = $_POST['email']; if(filter_var($email, FILTER_VALIDATE ...

  8. 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制

    第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...

  9. Java使用三种不同循环结构对1+2+3+...+100 求和

    ▷//第一种求法,使用while结构 /** * @author 9527 * @since 19/6/20 */ public class Gaosi { public static void ma ...

  10. grep命令最经常使用的功能总结

    1. grep最简单的用法,匹配一个词:grep word filename 2. 能够从多个文件里匹配:grep word filename1 filenam2 filename3 3. 能够使用正 ...