题目传送门

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

建反图的思想妙啊!

最新文章

  1. 主机无法访问虚拟机Linux的apache
  2. 追本溯源 解析“大数据生态环境”发展现状(CSDN)
  3. order by调优的一些测试
  4. spring中注解事务认识
  5. 把一个string串的所有小写字母转成大写字母的例子来看看看全局函数的使用
  6. 【POJ2985】【Treap + 并查集】The k-th Largest Group
  7. AltiumDesigner导入AutoCAD文件DXF,DWG格式
  8. Kafka 集群消息监控系统:Kafka Eagle
  9. jq点击事件不生效,效果只闪现一次又立马消失的原因?
  10. Linux 下 pushd,popd,cd- 用法
  11. Xshell正编辑文件时掉线,需再次正常编辑解决办法
  12. operator的itemgetter和attrgetter
  13. 【题解】Luogu P1533 可怜的狗狗
  14. Yaml学习文档
  15. dedecms织梦列表页调用TAG标签并带上链接的实现方法
  16. SQL:Oracle 目录
  17. GIS(地理信息系统)
  18. tomcat原理分析与简单实现
  19. 第二阶段Sprint冲刺会议3
  20. README.android

热门文章

  1. redis 实际应用中的缓存作用(转)
  2. mysql too many connection 解决办法
  3. JAVA原始的导出excel文件,快捷通用 方便 还能够导出word文档哦
  4. Meteor事件
  5. nyoj473 A^B Problem (高速幂)
  6. hdu 3255 Farming(扫描线)
  7. MongoDB 操作手冊CRUD 更新 update
  8. vim怎么把一个写的代码文件另存到任意文件夹里?
  9. Docker vs. Kubernetes vs. Apache Mesos: Why What You Think You Know is Probably Wrong
  10. 在做java 的web开发,为什么要使用框架