题解 P3627 【[APIO2009]抢掠计划】
咕了四个小时整整一晚上
P3627 [APIO2009]
抢掠计划(https://www.luogu.org/problemnew/show/P3627)
不难看出答案即为该有向图的最长链长度(允许重复
我会dp!
但是图中可能有环,不满足dp的无后效性假设
我会tarjan!
(您太强了)
在同一个强连通分量里的点一定可以互相到达,tarjan缩点之后,将每一个强联通分量看作一个点,价值就是其中所有银行的价值总和
缩点完成之后我们重新构造一个新的图,原来连接两个点的边改成连向两个点所在的强连通分量(如果在同一个强连通分量里?这就是环了不用管)
接着本来想写bfs求最长路……写着写着感觉就变成spfa了(笑哭)
最后我们算出起点到每一个强连通分量的最长路,枚举每一个点,判断有酒吧就更新答案
#include<bits/stdc++.h>
#define ll long long
#define inf 0x7fffffff
using namespace std;
int n,m;
#define maxn 500009
vector<int> son[maxn];
int c[maxn];
bool bar[maxn];
void add(int x,int y)
{
son[x].push_back(y);
}
int s,p;
int dfsn[maxn],lowlink[maxn];
int sta[maxn];
int top=;
int dfs_clock=;
int scc_cnt=;//有多少个强连通分量
int scc[maxn];//每个点在那个强连通分量里
int val[maxn];//每个点所在的强连通分量的价值总和
int q[maxn];
int vy[maxn];//每个强连通分量的价值总和
void dfs_scc(int x)//tarjan!!!
{
dfsn[x]=lowlink[x]=++dfs_clock;
sta[++top]=x;
for(int i=;i<son[x].size();i++)
{
int now=son[x][i];
if(!dfsn[now])
{
dfs_scc(now);
lowlink[x]=min(lowlink[x],lowlink[now]);
}else if(!scc[now])
{
lowlink[x]=min(lowlink[x],dfsn[now]);
}
}
if(lowlink[x]==dfsn[x])
{
scc_cnt++;
int ans=;
int p=;
while(sta[top]!=x)
{
q[++p]=sta[top];//挖坑提示:q是一个用来记录的数组,把强连通分量中的点记录下来,这个q一定要开全局变量,不用memset
//如果每次在递归中定义一个q,一轮就会爆栈!!!!本地出现蜜汁错误,洛谷ide却没问题!!
ans+=c[sta[top]];
scc[sta[top--]]=scc_cnt;
}
top--;
scc[x]=scc_cnt;
q[++p]=x;
ans+=c[x];
vy[scc_cnt]=ans;
for(int i=;i<=p;i++)
{
val[q[i]]=ans;
}
}
}
struct node{
int x,y;
}e[maxn];;
vector<int> newmap[maxn];
int in[maxn],d[maxn];
struct point{
int x,step;
};
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
e[i].x=x,e[i].y=y;
}
for(int i=;i<=n;i++)
{
scanf("%d",&c[i]);
}
scanf("%d%d",&s,&p);
memset(bar,,sizeof(bar));
for(int i=;i<=p;i++)
{
int x;
scanf("%d",&x);
bar[x]=;
}
for(int i=;i<=n;i++)
{
if(!dfsn[i])dfs_scc(i);
}
for(int i=;i<=m;i++)//一条边的两个端点必须不在同一个强连通分量里
{
if(scc[e[i].x]!=scc[e[i].y])
{
newmap[scc[e[i].x]].push_back(scc[e[i].y]);
}
} queue<int> q;
q.push(scc[s]);
d[scc[s]]=val[s];
while(!q.empty())//广搜,不,事实上这是一个spfa
{
int xx=q.front();
int x=xx;
q.pop();
// printf("x:%d %d\n",x,xx.step);
for(int i=;i<newmap[x].size();i++)
{
int to=newmap[x][i];
if(d[to]>=d[x]+vy[to])continue; //类似于松弛的操作……
d[to]=max(d[to],d[x]+vy[to]);
q.push(to);
}
}
int ans=;
for(int i=;i<=n;i++)
{
if(bar[i])//如果这个点有酒吧,那么我们就统计一下它所在的强连通分量的答案
{
ans=max(ans,d[scc[i]]);
}
}
printf("%d\n",ans);
return ;
}
题解 P3627 【[APIO2009]抢掠计划】的更多相关文章
- P3627 [APIO2009]抢掠计划
P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...
- 【luogu P3627 [APIO2009]抢掠计划】 题解
题目链接:https://www.luogu.org/problemnew/show/P3627 把点权转化到边权上去. #include <stack> #include <que ...
- 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)
洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...
- 洛谷 P3627 [APIO2009]抢掠计划 题解
Analysis 建图+强连通分量+SPFA求最长路 但要保证最后到达的点中包含酒馆 虽然思路并不难想,但要求的代码能力很高. #include<iostream> #include< ...
- 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路
题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...
- [洛谷P3627][APIO2009]抢掠计划
题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...
- 洛谷 P3627 [APIO2009]抢掠计划
这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...
- APIO2009 抢掠计划 Tarjan DAG-DP
APIO2009 抢掠计划 Tarjan spfa/DAG-DP 题面 一道\(Tarjan\)缩点水题.因为可以反复经过节点,所以把一个联通快中的所有路口看做一个整体,缩点后直接跑\(spfa\)或 ...
- [APIO2009]抢掠计划(Tarjan,SPFA)
[APIO2009]抢掠计划 题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是, ...
随机推荐
- FPGA课设-基于Xilinx Basys2开发板的除法器设计
介绍一下Basys开发板: Basys2 FPGA开发板是一个电路设计实现平台,任何人都可以通过它来搭建一个真正的数字电路.Basys2是围绕着一个Spartan-3E FPGA芯片和一个Atmel ...
- lua.c:82:10: fatal error: readline/readline.h: No such file or directory #include <readline/readline.h>
make linuxcd src && make linuxmake[1]: Entering directory `/root/lua/lua-5.3.2/src'make all ...
- Mybatis源码学习之事务管理(八)
简述 在实际开发中,数据库事务的控制是一件非常重要的工作,本文将学习Mybatis对事务的管理机制.在Mybatis中基于接口 Transaction 将事务分为两种,一种是JdbcTransacti ...
- Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
转自:https://blog.csdn.net/leunging/article/details/80599282 感谢CSDN博主「leunging」的总结分享 ———————————————— ...
- @Value和@PropertySource实现*.properties配置文件读取过程和实现原理
@Value和@PropertySource实现*.properties 配置文件读取过程和实现原理 1 配置使用步骤 (1)右击resource目录添加*.prooerties配置文件
- 机器学习朴素贝叶斯 SVC对新闻文本进行分类
朴素贝叶斯分类器模型(Naive Bayles) Model basic introduction: 朴素贝叶斯分类器是通过数学家贝叶斯的贝叶斯理论构造的,下面先简单介绍贝叶斯的几个公式: 先验概率: ...
- scikit-learn:CountVectorizer提取tf都做了什么
from: https://blog.csdn.net/mmc2015/article/details/46866537 http://scikit-learn.org/stable/modules/ ...
- HDU3549:Flow Problem(最大流入门EK)
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> ...
- 在Ubuntu 16.04 LTS下编译安装OpenCV 4.1.1
目录 一 安装前的准备 二 编译并安装OpenCV 4.1.1 注:原创不易,转载请务必注明原作者和出处,感谢支持! OpenCV目前(2019-8-1)的最新版本为4.1.1.本文将介绍如何在Ubu ...
- <JavaScript>如何阅读《JavaScript高级程序设计》(一)
题外话 最近在看<JavaScript高级程序设计>这本书,面对着700多页的厚书籍,心里有点压力,所以我决定梳理一下..探究一下到底怎么读这本书.本书的内容好像只有到ES5...所以只能 ...