博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法竞赛进阶指南 图论 最短路
阅读量:4493 次
发布时间:2019-06-08

本文共 1444 字,大约阅读时间需要 4 分钟。

题意:一张图,由单向边和双向边组成,每个节点有固定的权值,求从1走到n的最大权值之差

(不知道为啥放最短路里,明明一个bfs就可以解决了

存边时除了单向双向边要注意,还要存一张反边图

bfs一遍记录从1到n每个节点到1的最小权值

再bfs一遍跑反边图,记录从n到1每个节点到n的最大权值

最后遍历一遍统计最大差值就ok了

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef pair
P;typedef long double ld;#define mem(x) memset(x, 0, sizeof(x))#define me(x) memset(x, -1, sizeof(x))#define fi first#define se second#define fo(i,n) for(i=0; i
q; q.push(1); vis[1]=1; mi[1]=min(mi[1], a[1]); while(q.size()) { ll u=q.front(); q.pop(); for(ll i=head[u]; ~i; i=e[i].nxt) { ll v=e[i].to; mi[v]=min(min(mi[v],a[v]), mi[u]); if(!vis[v]) { vis[v]=1; q.push(v); } } } q.push(n); vi[n]=1; mx[n]=max(mx[n], a[n]); while(q.size()) { ll u=q.front(); q.pop(); for(ll i=head1[u]; ~i; i=e1[i].nxt) { ll v=e1[i].to; mx[v]=max(max(mx[v],a[v]), mx[u]); if(!vi[v]) { vi[v]=1; q.push(v); } } }}int main(){ ll i, j, k; ll n, m; ll u, v; cin>>n>>m; for(i=1; i<=n; i++) cin>>a[i], mi[i]=oo, head[i]=-1, mx[i]=-oo, head1[i]=-1; while(m--) { cin>>u>>v>>k; if(k==1) add(u,v), add1(v,u); else add(u,v), add(v,u), add1(u,v), add1(v,u); } bfs(n); ll ans=0; for(i=1; i<=n; i++) //cout<
<<" "<
<
mi[i]) ans=max(mx[i]-mi[i], ans); } cout<
<
View Code

 

转载于:https://www.cnblogs.com/op-z/p/11295093.html

你可能感兴趣的文章
Centos7.3_64位安装Apache2.4_mysql5.7_php5.4(阿里云LAMP php环境搭建图文教程)
查看>>
关于android@home的一点想法
查看>>
智能查寝第一次迭代心得
查看>>
如何选购PLC产品
查看>>
WordPress页脚添加运行时间显示
查看>>
PowerDesigner 逆向工程 Could not Initialize JavaVM!
查看>>
用python抓取oj题目(3)——django显示
查看>>
no.5京东物流系统架构系统演讲中的最佳实践读后感
查看>>
JAVA AES加密算法实现代码
查看>>
STL 之map解决 Message Flood(原字典树问题)
查看>>
Spring Maven——pom.xml及settings.xml配置
查看>>
软件测试基本知识
查看>>
nodejs项目windows下开机自启动
查看>>
1136 - Division by 3
查看>>
1_基本语法之关键字和保留字_标识符_注释
查看>>
Git知识总览(二) git常用命令概览
查看>>
新的移动端框架
查看>>
最近的总结
查看>>
NHiberante的优缺点
查看>>
SQLite 入门教程(二)创建、修改、删除表
查看>>