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. ------------------------------------------------------ ...
随机推荐
- 转Web开发的发展史---Web开发技术的演变
转自:http://blog.csdn.net/zzzkk2009/article/details/9849431 在接下来的几个月时间里,我打算写一系列关于完整web开发的文章.这第一篇文章虽然有所 ...
- Jenkins系列-Jenkins忘记密码的修复方法
找回 admin 用户的密码后,可以登录系统修改其他用户的密码. 1. Jenkins 目录结构 Jenkins 没有使用数据库,所有的信息都保存在 JENKINS_HOME 目录下的文件中.其中 J ...
- php裁剪图片(支持定点裁剪)
/** * 图片裁剪函数,支持指定定点裁剪和方位裁剪两种裁剪模式 * @param <string> $src_file 原图片路径 * @param <int> $new_w ...
- [CLR via C#]值类型的装箱和拆箱
我们先来看一个示例代码: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Array ...
- android异常Unable to instantiate activity ComponentInfo解决方法
我是下面提到的第四条: 在Order and Export 中 把新加的 android-support-v4.jar的前面的对号打上勾 保存:就可以了: 做android开发的可能都碰到" ...
- 自定义JS Map 函数
// 自定义JS Map 函数 function Map() { var map = function (key, value) {//键值对 this.key = key; this.value = ...
- matlab eval【转】
Matlab 简单谈谈EVAL函数的用法 EVAL(s)相当于把字符串s的内容作为语句来执行. 比如:eval('a=3*5') 和直接在command 窗口中输入 a=3*5 等效 eval 一个经 ...
- MATLAB strcmp
比较两个输入字符串是否相等 c = strcmp(str1,str2)比较字符串 str1 与 str2 ,若完全相等则返回 1 ,不相等返回 0 str1 = 'hello'; str2 = 'he ...
- 【bzoj2870】最长道路tree 树的直径+并查集
题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每 ...
- 【bzoj4698】[Sdoi2008] Sandy的卡片 后缀数组
题目描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列 ...