博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP2009(codevs1173)最优贸易
阅读量:4972 次
发布时间:2019-06-12

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

题目大意:给你一张有n个点m条边的有向图,每个点有一个权值,求一条1到n的路径,使得这条路径上存在两个点且他们的权值差最大。

思路:用dis[i]]记录从1到i的路径中所能得到两点间权值差的最大值,然后用spfa或dijkstra来求dis数组的最大值

#include
#include
#include
#include
const int MAXN=200007; using namespace std;queue
q;int head[MAXN],nextt[MAXN],dis[MAXN],tot,e[2000077],buy[MAXN];int vis[MAXN];template
void read(T &x){ x=0;int f=0;char ch=getchar(); while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x=f?-x:x;}void add(int u,int v){ e[++tot]=v; nextt[tot]=head[u]; head[u]=tot;}int main(){ int x,y,z,m,n; memset(dis,-1,sizeof(dis)); read(n),read(m); for(int i=1;i<=n;++i) read(buy[i]); for(int i=1;i<=m;++i) { read(x),read(y),read(z); add(x,y); if(z==2) add(y,x); } q.push(1); while(!q.empty()) { int x=q.front();q.pop(); vis[x]=233; for(int i=head[x];i;i=nextt[i]) { int y=e[i]; if(dis[y]==-1||dis[y]
0) dis[y]=buy[y]-buy[x]; } if(dis[y]
dis[y]) dis[y]=dis[x]; } if(vis[y]==0) { vis[y]=1; q.push(y); } } } if(dis[n]==-1) printf("0"); else printf("%d",dis[n]); return 0;}

 

转载于:https://www.cnblogs.com/Peper/p/8994138.html

你可能感兴趣的文章
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
leetcode【67】-Bulb Switcher
查看>>
JS验证图片格式和大小并预览
查看>>
laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块...
查看>>
编写高质量代码--改善python程序的建议(六)
查看>>
windows xp 中的administrator帐户不在用户登录内怎么解决?
查看>>
接口和抽象类有什么区别
查看>>
Codeforces Round #206 (Div. 2)
查看>>
Mycat分表分库
查看>>
模板的文件名和方法名一定要一致!!
查看>>
**p
查看>>
优先队列详解
查看>>
VS2012 创建项目失败,,提示为找到约束。。。。
查看>>
设计类图
查看>>
类对象
查看>>
ios 上架流程
查看>>
ajax连接池和XMLHttpRequest
查看>>
[Voice communications] 声音的滤波
查看>>
BZOJ.3139.[HNOI2013]比赛(搜索 Hash)
查看>>