CountHunter 6101 最优贸易 强联通缩点
题解:强连通锁点之后。 就成了一副单向图。 然后对于每个点 找到 后面合法的点的最大值就好了。 合法就是后面的那个点可以走到n号点。
也可以正向跑一遍dij 求出到这个点的最小花费。 然后在反向跑dij跑出n到这个点的最大花费,然后枚举每个点。
代码:
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod = (int)1e9+;
const int N = 1e5 + ;
const int M = 1e6 + ;
int head[N], to[M], nt[M], tot = ;
int a[N];
vector<int> vc[N];
void add(int u, int v){
to[tot] = v;
nt[tot] = head[u];
head[u] = tot++;
}
int n, m, u, v, op;
int belong[N], dfn[N], low[N], now_time, scc_cnt;
int mx[N], mn[N], ret[N];
stack<int> s;
void dfs(int u){
dfn[u] = low[u] = ++now_time;
s.push(u);
for(int i = head[u]; ~i; i = nt[i]){
if(!dfn[to[i]]) dfs(to[i]);
if(!belong[to[i]]) low[u] = min(low[u], low[to[i]]);
}
if(dfn[u] == low[u]){
++scc_cnt;
int now;
while(){
now = s.top(); s.pop();
belong[now] = scc_cnt;
if(now == u) break;
}
}
}
void scc(int n){
now_time = scc_cnt = ;
for(int i = ; i <= n; ++i)
if(!belong[i]) dfs(i);
int v;
for(int i = ; i <= n; ++i){
for(int j = head[i]; ~j; j=nt[j]){
v = to[j];
if(belong[v] != belong[i]){
vc[belong[i]].pb(belong[v]);
}
}
}
for(int i = ; i <= n; ++i){
int rt = belong[i];
if(ret[rt] == ){
ret[rt] = -;
mn[rt] = a[i];
mx[rt] = a[i];
}
else {
mn[rt] = min(mn[rt], a[i]);
mx[rt] = max(mx[rt], a[i]);
}
}
}
int ans = ;
int solve(int x){
if(ret[x] != -) return mx[x];
ret[x] = ;
int mmax = -;
if(x == belong[n]) mmax = mx[x];
for(int v : vc[x]){
mmax = max(solve(v), mmax);
}
if(mmax != -) {
mx[x] = max(mx[x], mmax);
ans = max(ans, mx[x]-mn[x]);
}
else mx[x] = -;
return mx[x];
}
int main(){
memset(head, -, sizeof(head));
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++i) scanf("%d", &a[i]);
for(int i = ; i <= m; ++i){
scanf("%d%d%d", &u, &v, &op);
add(u, v);
if(op == ) add(v, u);
}
scc(n);
solve(belong[]);
cout << ans << endl;
return ;
}
CountHunter 6101 最优贸易 强联通缩点的更多相关文章
- Intelligence System (hdu 3072 强联通缩点+贪心)
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- POJ 2186 Popular Cows(强联通+缩点)
Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= ...
- Proving Equivalences (hdu 2767 强联通缩点)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- [bzoj 1093][ZJOI2007]最大半联通子图(强联通缩点+DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1093 分析: 首先肯定是先把强联通全部缩成一个点,然后成了一个DAG 下面要知道一点: ...
- HDU 2767-Proving Equivalences(强联通+缩点)
题目地址:pid=2767">HDU 2767 题意:给一张有向图.求最少加几条边使这个图强连通. 思路:先求这张图的强连通分量.假设为1.则输出0(证明该图不须要加边已经是强连通的了 ...
- POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)
[题意]: 有N个房间,M条有向边,问能否毫无顾虑的随机选两个点x, y,使从①x到达y,或者,②从y到达x,一定至少有一条成立.注意是或者,不是且. [思路]: 先考虑,x->y或者y-> ...
- HDU 6170 FFF at Valentine(强联通缩点+拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6165 题意:给你一个无环,无重边的有向图,问你任意两点,是否存在路径使得其中一点能到达另一点 解析:强 ...
- BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- Restful API 中的错误处理
简介 随着移动开发和前端开发的崛起,越来越多的 Web 后端应用都倾向于实现 Restful API. Restful API 是一个简单易用的前后端分离方案,它只需要对客户端请求进行处理,然后返回结 ...
- RocketMQ中Broker的启动源码分析(一)
在RocketMQ中,使用BrokerStartup作为启动类,相较于NameServer的启动,Broker作为RocketMQ的核心可复杂得多 [RocketMQ中NameServer的启动源码分 ...
- Apache之——多虚拟主机多站点配置的两种实现方案
Apache中配置多主机多站点,可以通过两种方式实现: 将同一个域名的不同端口映射到不同的虚拟主机,不同端口映射到不同的站点: 将同一个端口映射成不同的域名,不同的域名映射到不同的站点. 我们只需要修 ...
- 有助于提高"锁"性能的几点建议
有助于提高"锁"性能的几点建议 1.减少锁持有时间 public synchronized void syncMethod() { othercode1(); mutextMeth ...
- 洛谷P2630 题解
我先讲一下我的思路 将A,B,C,D四种操作用函数储存起来: 枚举所有可能出现的情况:A,B,C,D,AA,AB,AC,AD,BB,BC,BD,CC,CD,DD,ABC,ABD,ACD,BCD,ABC ...
- appcan IDE 无法 请求数据
我们4月27号从4.0.1升级到4.0.2后,IDE本地预览get请求不到数据.但是在线打包安装到手机又是正常的. 先下载 "uexXmlHttpMgr.rar",下载链接:htt ...
- 高性能MySQL之事物
一.概念 事务到底是什么东西呢?想必大家学习的时候也是对事务的概念很模糊的.接下来通过一个经典例子讲解事务. 银行在两个账户之间转账,从A账户转入B账户1000元,系统先减少A账户的1000元,然后再 ...
- 什么是HTML,HTML的简介,HTML结构
html:超文本标记语言(Hyper Text Markup Language) ==============基本结构================= <html><!--最外层为 ...
- python历史背诵
一.python简介 python2:源代码不统一 有重复功能的代码 默认编码是ascii 没有中文 输出中文需要用头文件 #-*-coding=utf-8-*- 进行转换 py3:源代码统一 没有重 ...
- 小白学Python(7)——利用Requests下载网页图片、视频
安装 Requests 如果安装了Requests就已经可用了,否则要安装 Requests,只要在你的CMD中运行这个简单命令即可: pip install requests requests使用 ...