bzoj 1179 tarjan+spfa
首先我们可以将这个图缩成DAG,那么问题中的路线就可以简化为DAG中的一条链,那么我们直接做一遍spfa就好了。
反思:开始写的bfs,结果bfs的时候没有更新最大值,而是直接赋的值,后来发现不能写bfs,因为每个点可能进队好多次,当让可以改成循环队列什么的bfs,然后我就改成了spfa,伪的spfa,就是判一下这个点是不是更优了,更优才入队。
/**************************************************************
Problem: 1179
User: BLADEVIL
Language: C++
Result: Accepted
Time:6640 ms
Memory:109356 kb
****************************************************************/
//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxm 2000010
#define maxn 2000010
using namespace std;
int n,m,s,tot,time,num,p,l;
int pre[maxm],other[maxm],last[maxn],key[maxn],flag[maxn];
int stack[maxn],dfn[maxn],low[maxn],vis[maxn],col[maxn],que[maxn],w[maxn];
void connect(int x,int y) {
pre[++l]=last[x];
last[x]=l;
other[l]=y;
}
void dfs(int x) {
stack[++tot]=x; vis[x]=;
dfn[x]=low[x]=++time;
for (int p=last[x];p;p=pre[p]) {
if (!dfn[other[p]])
dfs(other[p]),low[x]=min(low[x],low[other[p]]); else
if (vis[other[p]]) low[x]=min(low[x],dfn[other[p]]);
}
if (dfn[x]==low[x]) {
int cur=-;
num++;
while (cur!=x) {
cur=stack[tot--];
vis[cur]=;
col[cur]=num;
}
}
}
int main() {
scanf("%d%d",&n,&m); num=n;
for (int i=;i<=m;i++) {
int x,y; scanf("%d%d",&x,&y);
connect(x,y);
}
for (int i=;i<=n;i++) scanf("%d",&key[i]);
scanf("%d%d",&s,&p);
while (p--) {
int x; scanf("%d",&x);
flag[x]=;
}
dfs(s);
for (int i=;i<=n;i++) {
for (int p=last[i];p;p=pre[p]) if (col[i]!=col[other[p]]) connect(col[i],col[other[p]]);
}
for (int i=;i<=n;i++) key[col[i]]+=key[i],flag[col[i]]|=flag[i];
memset(vis,,sizeof vis);
que[]=col[s]; vis[col[s]]=; w[col[s]]=key[col[s]];
int h=,t=,ans=;
while (h<t) {
int cur=que[++h];
if (flag[cur]) ans=max(ans,w[cur]);
for (int p=last[cur];p;p=pre[p]) {
if (w[cur]+key[other[p]]>w[other[p]]) {
w[other[p]]=max(w[other[p]],w[cur]+key[other[p]]);
que[++t]=other[p]; vis[other[p]]=;
}
}
}
printf("%d\n",ans);
return ;
}
bzoj 1179 tarjan+spfa的更多相关文章
- BZOJ 1179 (Tarjan缩点+DP)
题面 传送门 分析 由于一个点可以经过多次,显然每个环都会被走一遍. 考虑缩点,将每个强连通分量缩成一个点,点权为联通分量上的所有点之和 缩点后的图是一个有向无环图(DAG) 可拓扑排序,按照拓扑序进 ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- BZOJ 1179 Atm 题解
BZOJ 1179 Atm 题解 SPFA Algorithm Tarjan Algorithm Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来 ...
- 【BZOJ1179】[Apio2009]Atm (tarjan+SPFA)
显而易见的tarjan+spfa...不解释了 ; type edgetype=record toward,next:longint; end; var edge1,edge2:..maxn] of ...
- bzoj 1179 [APIO 2009]Atm(APIO水题) - Tarjan - spfa
Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- 【BZOJ】1179: [Apio2009]Atm(tarjan+spfa)
http://www.lydsy.com/JudgeOnline/problem.php?id=1179 缩点建图... #include <cstdio> #include <cs ...
- bzoj 1179: [Apio2009]Atm【tarjan+spfa】
明明优化了spfa还是好慢-- 因为只能取一次值,所以先tarjan缩点,把一个scc的点权和加起来作为新点的点权,然后建立新图.在新图上跑spfa最长路,最后把酒吧点的dis取个max就是答案. # ...
- bzoj 1179 [Apio2009]Atm——SCC缩点+spfa
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 显然SCC缩点. 然后准备倒着拓扑序推到st,结果WA. 听TJ说dj求最长路会发生不 ...
- BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )
对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. ------------------------------------------------------ ...
随机推荐
- 第五部分shell项目一监控脚本
需求: 使用shell定制各种个性化告警工具,但需要统一化管理.规范化管理. 思路:指定一个脚本包,包含主程序.子程序.配置文件.邮件引擎.输出日志等.主程序:作为整个脚本的入口,是整个系统的命脉.配 ...
- 设置启动窗体Program.cs文件
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...
- 【转】how can i build fast
http://blog.csdn.net/pcliuguangtao/article/details/5830860
- 配置apt-get告诉下载源
本文转自:http://blog.csdn.net/hyl1718/article/details/7915296 方法: 1.修改源地址: cp /etc/apt/sources.list /etc ...
- 【bzoj2272】[Usaco2011 Feb]Cowlphabet 奶牛文字 dp
题目描述 Like all bovines, Farmer John's cows speak the peculiar 'Cow'language. Like so many languages, ...
- 【bzoj1704】[Usaco2007 Mar]Face The Right Way 自动转身机 贪心
题目描述 农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K( ...
- linux系统过一两分钟就断开的时间更改
vi /etc/ssh/sshd_config LoginGraceTime 参考man sshd_config LoginGraceTime The server disconnects after ...
- BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)
显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的.枚举中间位置二分答案,哈希判断即可.注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符. #include< ...
- Elasticsearch 更新索引settings
1.更新索引设置:将副本减至0,修改索引分析器为ik_max_word和检索分词器为ik_smart 2.需要先将索引关闭,然后再PUT setings POST user/_close PUT us ...
- LOJ6342::跳一跳——题解
https://loj.ac/problem/6342 f[i]表示从i开始跳的期望时间,f[n]=0. 所以f[i]=(f[i]+f[i+1]+……+f[n])/(n-i+1)+1. 移项整理可求f ...