洛谷 P3627 [APIO2009]抢掠计划 题解
Analysis
建图+强连通分量+SPFA求最长路
但要保证最后到达的点中包含酒馆
虽然思路并不难想,但要求的代码能力很高。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 500010
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
struct node
{
int from,to,val,nex;
}edge[*maxn];
int n,m,s,p,cnt,ans,top,inl,num;
int x[maxn],y[maxn],head[maxn],dfn[maxn],low[maxn],st[maxn],inn[maxn],sum[maxn],si[maxn],money[maxn],dis[maxn];
bool book[maxn],book1[maxn],bar[maxn];
inline void clear()
{
cnt=;
memset(edge,,sizeof(edge));
memset(head,,sizeof(head));
}
inline void add(int x,int y)
{
cnt++;
edge[cnt].to=y;
edge[cnt].nex=head[x];
head[x]=cnt;
}
inline void build(int x,int y,int z)
{
cnt++;
edge[cnt].from=x;
edge[cnt].to=y;
edge[cnt].val=z;
edge[cnt].nex=head[x];
head[x]=cnt;
}
inline void Tarjan(int u)
{
dfn[u]=low[u]=++num;
st[++top]=u;
for(int i=head[u];i;i=edge[i].nex)
{
int v=edge[i].to;
if(!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!inn[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
inn[u]=++inl;
while(st[top]!=u)
{
if(bar[st[top]])book1[inl]=;
sum[inl]+=money[st[top]];
inn[st[top]]=inl;
--top;
}
if(bar[st[top]])book1[inl]=;
sum[inl]+=money[st[top]];
--top;
}
}
inline void spfa()
{
memset(book,,sizeof(book));
for(int i=;i<=n;i++) dis[i]=;
queue<int> q;
q.push(inn[s]);
book[inn[s]]=;
dis[inn[s]]=sum[inn[s]];
while(!q.empty())
{
for(int i=head[q.front()];i;i=edge[i].nex)
{
if(dis[edge[i].to]<dis[edge[i].from]+edge[i].val)
{
dis[edge[i].to]=dis[edge[i].from]+edge[i].val;
if(book[edge[i].to]==)
{
q.push(edge[i].to);
book[edge[i].to]=;
}
}
}
book[q.front()]=;
q.pop();
}
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
x[i]=read();y[i]=read();
add(x[i],y[i]);
}
for(int i=;i<=n;i++)money[i]=read();
s=read();p=read(); for(int i=;i<=p;i++)
{
int x;
x=read();
bar[x]=;
}
for(int i=;i<=n;i++)
if(!dfn[i])
Tarjan(i); clear();
for(int i=;i<=m;i++)
if(inn[x[i]]!=inn[y[i]])
build(inn[x[i]],inn[y[i]],sum[inn[y[i]]]);
spfa();
for(int i=;i<=inl;i++)
if(book1[i]==)
ans=max(ans,dis[i]);
write(ans);
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)
洛谷 P3627 [APIO2009]抢掠计划 题解的更多相关文章
- 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)
洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...
- 洛谷 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]抢掠计划
这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...
- 洛谷 P3627 【抢掠计划】
题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...
- BZOJ1179或洛谷3672 [APIO2009]抢掠计划
BZOJ原题链接 洛谷原题链接 在一个强连通分量里的\(ATM\)机显然都可被抢,所以先用\(tarjan\)找强连通分量并缩点,在缩点的后的\(DAG\)上跑最长路,然后扫一遍酒吧记录答案即可. # ...
- 洛谷3627 [APIO2009]抢掠计划
题目描述 输入格式: 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表示第 i 条道路的起点 ...
- P3627 [APIO2009]抢掠计划
P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...
- 洛谷 P3627 [APIO2009](抢掠计划 缩点+spfa)
题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...
随机推荐
- Python14之字符串(各种奇葩的内置方法)
一.字符串的分片操作 其分片操作和列表和元组一样 str1 = 'keshengtao' str1[2:6] 'shen' str1[:] 'keshengtao' str1[:4] 'kesh' 二 ...
- PyCharm:设置py文件头部信息
P PyCharm:设置py文件头部信息file->setting->appearance & behavior->editor->file and code temp ...
- wx.request 请求
wx.request 1.wx.request相当于ajax请求,和django后台进行交互 官方文档:https://developers.weixin.qq.com/miniprogram/dev ...
- triples I(按位或运算及3的特性)(2019牛客暑期多校训练营(第四场)D)
示例1: 输入: 2 3 7 输出: 1 32 3 6 说明:3=3, (3|6)=7 题意:输出尽可能少的数字,他们的按位或结果为输入的数字a. 题解:(表示看不懂题解,看山东大佬的代码看懂的)首先 ...
- 使用uiautomator 截图
1)PC与移动设备建立连接. 2)找到ADB的安装路径,双击启动uiautomator. 路径:D:\ProgramFiles\adt-bundle-windows-x86_64-20140702\a ...
- STL中的函数对象实现负数的定义
// // main.cpp // STL中的函数对象 // // Created by mac on 2019/5/2. // Copyright © 2019年 mac. All rights r ...
- 怎样理解window对象的几组位置大小属性
第一组: window.screenX 和 window.screenY, 只读, 返回浏览器窗口左上角与屏幕左上角的水平距离和垂直距离(单位像素); 第二组: window.innerHeight ...
- 返回ArrayBuffer数据下载
返回的数据 const blob = new Blob([response.data]); if ('download' in document.createElement('a')) { const ...
- Linux基础命令汇总109条
1 文件管理 1.1 basename 1.1.1 功能说明 从文件名中去掉路径和扩展名 例:basename include/stdio.h .h Output &quo ...
- Hbase Region in transition问题解决
1 hbase hbck -repair 强制修复 如果ok就可以 2 不ok,找到hdfs上对应的该表位置,删除,之后在使用hbase hbck -repair 解决过程: 第一次,使用了方法二, ...