noip2009最优贸易(水晶球)
题目:http://codevs.cn/problem/1173/ https://www.luogu.org/problemnew/show/P1073
本来考虑缩点什么的,后来发现不用。
只要记录一下从起点走到现在经过的最小值和从终点走到现在经过的最大值就行了。
从终点走到现在就是记录一个反向边。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N=1e5+,M=5e5+;
int n,m,head1[N],xnt1,head2[N],xnt2;
ll c[N],fn[N],fx[N],mx;
bool vis1[N],vis2[N];
struct Edge{
int next,to;
Edge(int n=,int t=):next(n),to(t) {}
}edge1[M<<],edge2[M<<];
void add(int x,int y)
{
edge1[++xnt1]=Edge(head1[x],y);head1[x]=xnt1;
edge2[++xnt2]=Edge(head2[y],x);head2[y]=xnt2;
}
void read()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%lld",&c[i]);
int x,y,z;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y);if(z==)add(y,x);
}
}
void dj1()
{
memset(fn,,sizeof fn);
priority_queue<pair<ll,int> > q;fn[]=c[];q.push(make_pair(fn[],));
while(q.size())
{
int k=q.top().second;q.pop();
while(vis1[k]&&q.size())k=q.top().second,q.pop();
if(vis1[k])break;vis1[k]=;
for(int i=head1[k],v;i;i=edge1[i].next)
if(min(fn[k],c[v=edge1[i].to])<fn[v])
{
fn[v]=min(fn[k],c[v]);q.push(make_pair(fn[v],v));
}
}
}
void dj2()
{
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > >q;
fx[n]=c[n];q.push(make_pair(fx[n],n));
while(q.size())
{
int k=q.top().second;q.pop();
while(vis2[k]&&q.size())k=q.top().second,q.pop();
if(vis2[k])break;vis2[k]=;
for(int i=head2[k],v;i;i=edge2[i].next)
if(max(fx[k],c[v=edge2[i].to])>fx[v])
{
fx[v]=max(fx[k],c[v]);q.push(make_pair(fx[v],v));
}
}
}
int main()
{
read();
dj1();dj2();
for(int i=;i<=n;i++)
if(vis1[i]&&vis2[i])
mx=max(mx,fx[i]-fn[i]);
printf("%lld",mx);
return ;
}
noip2009最优贸易(水晶球)的更多相关文章
- [NOIP2009]最优贸易(图论)
[NOIP2009]最优贸易 题目描述 CC 国有 \(n\) 个大城市和 \(m\) 条道路,每条道路连接这 \(n\) 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 \(m\ ...
- [Luogu 1073] NOIP2009 最优贸易
[Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ...
- NOIP2009 最优贸易
3. 最优贸易 (trade.pas/c/cpp) [问题描述] C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间 多只有一条道路直接相连.这 m 条道 ...
- 【洛谷P1073】[NOIP2009]最优贸易
最优贸易 题目链接 看题解后感觉分层图好像非常NB巧妙 建三层n个点的图,每层图对应的边相连,权值为0 即从一个城市到另一个城市,不进行交易的收益为0 第一层的点连向第二层对应的点的边权为-w[i], ...
- [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)
传送门 Description C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分 为 ...
- NOIP2009最优贸易[spfa变形|tarjan 缩点 DP]
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- noip2009最优贸易
试题描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
- 洛谷1073 NOIP2009 最优贸易
题目大意 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
- [NOIP2009] 最优贸易 (最短路,分层图)
题目链接 Solution 分层图+\(SPFA\). 建立3层图,其中每一层之中的边权赋为0. 对于任意一条边 \(t\) ,其起点 \(x\) 和终点 \(y\). 我们将 \(x\) 在第一层的 ...
随机推荐
- 想转行学Java,却又担心自己半路出家成不了大牛
想转行学Java,却又担心自己半路出家成不了大牛 很多人看好Java编程的高薪前景,在自己职业生涯迷茫的时候,想转行学Java,却又担心自己半路出家成不了大牛,赚不到钱,本文就为大家分析一下,转行学J ...
- jsoop_封装
<script> //java.utils.ArrayList() //包(命名空间) /* var java = {}; java.utils = {}; java.utils.Arra ...
- BZOJ 3123 【SDOI2013】 森林
题目链接:森林 这道题想法很显然.既然只有加边而没有删边,那么每次启发式合并就可以了.查询路径\(k\)小似乎需要主席树,那么把主席树和倍增表一起暴力重构就好了. 然后发现这样的空间复杂度是\(O(n ...
- C++实现可变参数列表
// 接收数量不定的实参.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #includ ...
- linux突然断电重启,配置文件丢失/程序无法打开/文件损坏
电脑突然断电,重新开机后发现有的程序无法正常启动,原因是配置文件损坏了.感觉奇怪,为什么在硬盘里的文件会内容丢失? 1.可能:写数据的过程被中断,只完成了一部分.可能会出现乱码(因为只写了几个字节,不 ...
- php while循环
<html> <body> <?php $i=; ) { echo "The number is " . $i . "<br>& ...
- Tp5,Service使用
C层,操控数据库,并处理页面数据展示. M层,纯粹的操作自己所对应的数据库. Service层,可以通用的处理一些逻辑计算,也可以将复杂的数据表处理整合到一起,也可以将复杂的业务逻辑整合到一起. 创建 ...
- redis高可用 - redis集群
redis-sentinel方案提供了单点的高可用解决方案,但是当数据量和业务量极速增长时,单点的reids不可能无限的纵向扩容(增大内存),这个时候就需要redis有集群的能力来扛. redis集群 ...
- java set初始化问题
set在执行add方法时,多次报空指针异常,后来发现Set初始化时,如果是 Set<Type> set = null; 这样的话,在执行 set.add(element)的时候会报空指针异 ...
- 类的成员变量修饰 const 和static
类型 初始化方式 类内(声明) 类外(类实现文件) 构造函数中 构造函数的初始化列表 非静态非常量数据成员 N N Y Y 非静态常量数据成员 N N N Y (must) 静态非常量数据成员 N Y ...