[NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP
Description&Data
题面:https://www.luogu.org/problemnew/show/P1073
Solution
Tarjan对联通块缩点,在DAG上按照拓扑序更新最低买入价,到每个点时再更新一下答案,即联通块内最大卖出价减去沿途的最低价格,复杂度O(n).
看机房其他人有写双向SPFA,代码短一些,反向建一张图,一遍跑最大价格,一遍跑最小价格,这样保证最大差值产生自同一条路径,最后取差即为答案。
Tarjan代码如下:(SPFA在后面)
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<stack>
#define maxn 100005
#define maxm 500005
using namespace std;
struct edge{
int to,nxt;
}e[maxm<<1],ce[maxm];
int edgenum,lnk[maxn],a[maxn],n,m,u,v,t;
int dfn[maxn],low[maxn],blk[maxn],dgr[maxn],cnt,num;
int mn[maxn],mx[maxn],f[maxn],q[maxn],hd=0,tl=1;
int ans[maxn];
bool vis[maxn];
stack<int> st;
inline int rd()
{
int x=0;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
void add(int bgn,int end)
{
e[++edgenum].to=end;
e[edgenum].nxt=lnk[bgn];
lnk[bgn]=edgenum;
}
int cedgenum,clnk[maxn];
void c_add(int bgn,int end)
{
ce[++cedgenum].to=end;
ce[cedgenum].nxt=clnk[bgn];
clnk[bgn]=cedgenum;
}
void tarjan(int x)
{
dfn[x]=low[x]=++cnt;
vis[x]=1;
st.push(x);
for(int p=lnk[x];p;p=e[p].nxt){
int y=e[p].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(vis[y])low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
int now;
num++;
do{
now=st.top();st.pop();
mn[num]=min(mn[num],a[now]);
mx[num]=max(mx[num],a[now]);
vis[now]=0;
blk[now]=num;
}while(now!=x);
}
}
void topo()
{
for(int i=1;i<=num;++i){
f[i]=mn[i];
if(!dgr[i])q[tl++]=i;
}
while(++hd<tl){
int u=q[hd];
for(int p=clnk[u];p;p=ce[p].nxt){
int y=ce[p].to;
if(!--dgr[y])q[tl++]=y;
}
}
}
void solve()
{
hd=0;
while(++hd<tl){
int u=q[hd];
ans[u]=max(ans[u],mx[u]-f[u]);
for(int p=clnk[u];p;p=ce[p].nxt){
int y=ce[p].to;
f[y]=min(f[y],f[u]);
ans[y]=max(ans[y],ans[u]);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
mn[i]=0x3f3f3f;
for(int i=1;i<=n;++i)a[i]=rd();
for(int i=1;i<=m;++i){
u=rd(),v=rd(),t=rd();
if(t==1)add(u,v);
else add(u,v),add(v,u);
}
for(int i=1;i<=n;++i)
if(!dfn[i])tarjan(i);
int s=blk[1],end=blk[n];
for(int i=1;i<=n;++i){
for(int p=lnk[i];p;p=e[p].nxt){
int y=e[p].to;
if(blk[i]!=blk[y])c_add(blk[i],blk[y]),dgr[blk[y]]++;
}
}
topo();
solve();
printf("%d\n",ans[end]);
return 0;
}
SPFA占坑
[NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP的更多相关文章
- 「NOIP2009」最优贸易 题解
「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...
- 「NOIP2009」最优贸易
「NOIP2009」最优贸易 「NOIP2009」最优贸易内存限制:128 MiB时间限制:1000 ms 题目描述C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意 ...
- 洛谷P1073 最优贸易 [图论,DP]
题目传送门 最优贸易 题目描述 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向 ...
- luogu1073 最优贸易 (tarjan+dp)
tarjan缩点,然后按照拓扑序,做1号点能到达的点的答案具体做法是对每个点记一个min[i],max[i],vis[i]和ans[i]做拓扑序的时候,假设在从u点开始做,有边u到v,如果vis[u] ...
- [模板][Luogu3387] 缩点 - Tarjan, 拓扑+DP
Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...
- NOIP2009 t3 最优贸易
题目传送门:洛谷P1073 dalao们都用的tarjan啊拓扑排序啊之类的玩意儿,我这个蒟蒻不会,只想到了极其暴力的分层图最短路 设三个状态 0表示没有发生任何买卖的情况 1表示买了没有卖的情况 2 ...
- bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】
我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<i ...
- 【NOIP2009】最优贸易
描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通 ...
- #2590. 「NOIP2009」最优贸易
C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...
随机推荐
- ER图
E-R图也称实体-联系图(Entity Relationship Diagram), 提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. 它是描述现实世界概念结构模型的有效方法.是表示 ...
- business expressions(二)
1,to give someone a heads up = to inform someone about something important ("heads up") be ...
- 笔记:Spring Boot 监控与管理
在微服务架构中,我们将原本庞大的单体系统拆分为多个提供不同服务的应用,虽然,各个应用的内部逻辑因分解而简化,但由于部署的应用数量成倍增长,使得系统的维护复杂度大大提升,为了让运维系统能够获取各个为服务 ...
- 【Python】 编码,en/decode函数以及print语句的一些探索
昨天晚上在整理hashlib和hmac模块的时候,又看到了编码这块的内容.越看越觉得之前的理解不对,然后想研究一下自己想出来,但是越陷越深..总之把昨晚+今天一个上午的这些自己想到的东西写下来 ● 几 ...
- Myeclipse快速补充返回值快捷键
比如 image.getGraphics(); 按ALT+Shift+L键,弹出一个确认变量名称框,确认之后会补全语句Graphics graphics = image.getGraphics();
- Java ORM Hibernate 入门笔记
一.下载 官网地址:http://hibernate.org/ Hibernate下有ORM(关系型数据库).OGM(NoSQL数据库).Search(对象全文检索).Validator的工具. OR ...
- centos安装包选择--liveCD、liveDVD、bin-DVD、netinstall和minimal
在Centos官方选择下载centos的时候有好几个文件可供下载,包括liveCD.liveDVD和bin-DVD等等.这些文件都有什么区别,我们应该选择哪个文件下载呢? liveDVD版本:它就是一 ...
- selenium2自动化测试学习笔记(二)
chromedriver报错问题解决了,真是无语 是因为chromedriver与浏览器版本不一致 http://chromedriver.storage.googleapis.com/index.h ...
- Hive 报错:java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
在配置好hive后启动报错信息如下: [walloce@bigdata-study- hive--cdh5.3.6]$ bin/hive Logging initialized using confi ...
- Java 自定义实现链表
自定义实现链表很简单,只需要明白链表是什么样子的数据结构. 下图表示一种单向列表.其中指针first指向队头,last指向队尾,curr指向当前读的数据. 下面是我的实现代码,很简单,明白上述结构后, ...