BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1179
题意概括
有一个有向图,每一个节点有一个权值,其中有一些结束点。
现在,你要从S出发,到达任意一个结束点,使得经过的节点的权值和最大(可以重复经过某一个节点,但是权值只记入一次)。
题解
小码农题。
如果有强连通分量,那么之间的点是可以全部拿到的,傻子才不拿。
所以先Tarjan强连通缩个点。
然后就是一个DAG(有向无环图)了。
那么就是一个记忆化dfs的问题了。
于是就简单了。
but,尴尬的我犯了低级错误,又wa了一次……
代码
- #include <cstring>
- #include <algorithm>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- const int N=+;
- const int Inf=;
- struct Gragh{
- int cnt,x[N],y[N],nxt[N],fst[N];
- void set(){
- cnt=;
- memset(fst,,sizeof fst);
- }
- void add(int a,int b){
- x[++cnt]=a,y[cnt]=b;
- nxt[cnt]=fst[a],fst[a]=cnt;
- }
- }g,g2;
- int n,m,time,top,tot;
- int dfn[N],low[N],bh[N],st[N],w[N],v[N],dp[N],S,P;
- bool inst[N],vis[N],isp[N],fip[N];
- void Tarjan_Prepare(){
- time=top=tot=;
- memset(bh,,sizeof bh);
- memset(st,,sizeof st);
- memset(dfn,,sizeof dfn);
- memset(low,,sizeof low);
- memset(vis,,sizeof vis);
- memset(inst,,sizeof inst);
- }
- void Tarjan(int x){
- dfn[x]=low[x]=++time;
- inst[x]=vis[x]=;
- st[++top]=x;
- for (int i=g.fst[x];i;i=g.nxt[i])
- if (!vis[g.y[i]]){
- Tarjan(g.y[i]);
- low[x]=min(low[x],low[g.y[i]]);
- }
- else if (inst[g.y[i]])
- low[x]=min(low[x],low[g.y[i]]);
- if (dfn[x]==low[x]){
- tot++;
- bh[st[top]]=tot;
- inst[st[top]]=;
- while (st[top--]!=x){
- bh[st[top]]=tot;
- inst[st[top]]=;
- }
- }
- }
- int dfs(int x){
- if (dp[x]!=-Inf)
- return dp[x];
- dp[x]=fip[x]?v[x]:-Inf;
- for (int i=g2.fst[x];i;i=g2.nxt[i])
- dp[x]=max(dp[x],dfs(g2.y[i])+v[x]);
- return dp[x];
- }
- int main(){
- g.set();
- scanf("%d%d",&n,&m);
- for (int i=,a,b;i<=m;i++){
- scanf("%d%d",&a,&b);
- g.add(a,b);
- }
- for (int i=;i<=n;i++)
- scanf("%d",&w[i]);
- scanf("%d%d",&S,&P);
- memset(isp,,sizeof isp);
- memset(fip,,sizeof fip);
- memset(v,,sizeof v);
- for (int i=,pos;i<=P;i++){
- scanf("%d",&pos);
- isp[pos]=;
- }
- Tarjan_Prepare();
- for (int i=;i<=n;i++)
- if (!vis[i])
- Tarjan(i);
- g2.set();
- for (int i=;i<=n;i++)
- v[bh[i]]+=w[i],fip[bh[i]]|=isp[i];
- for (int i=;i<=g.cnt;i++)
- if (bh[g.x[i]]!=bh[g.y[i]])
- g2.add(bh[g.x[i]],bh[g.y[i]]);
- for (int i=;i<=tot;i++)
- dp[i]=-Inf;
- printf("%d",dfs(bh[S]));
- return ;
- }
BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划的更多相关文章
- BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4048 Solved: 1762 [Submit][Sta ...
- BZOJ1179 : [Apio2009]Atm 缩点+spfa
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 2069 Solved: 826[Submit][Status ...
- NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...
- bzoj1179: [Apio2009]Atm scc缩点+dag上dp
先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...
- BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )
对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. ------------------------------------------------------ ...
- 【BZOJ-1179】Atm Tarjan + SPFA
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 2407 Solved: 993[Submit][Status ...
- 【CCF】高速公路 tarjan强连通缩点
[题意] 给定一个有向图,问图中互相可达(强连通)的点有多少对 [AC] 强连通缩点,缩点后是一个DAG,所以互相可达的点只在强连通块里. #include<iostream> #incl ...
- 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路
题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...
随机推荐
- STM32Cube自学-1
为了方便调试,使用Keil5+Proteus.1.新建Proteus STM32项目,选择STMF103C6 2.新建STM32CubeMX项目,选择同型号CPU,选择UART1,Asynchrono ...
- C# 生成一个带数字的饼图
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...
- linux4.10.8 内核移植(一)---环境搭建及适配单板。
一.环境搭建 源码包下载:git clone https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.10.8.tar.gz 或者直接去kernel. ...
- 工控安全入门之Ethernet/IP
这一篇依然是协议层面的,协议层面会翻译三篇,下一篇是电力系统中用的比较多的DNP3.这一篇中大部分引用的资料都可以访问到,只有一篇reversemode.com上的writeup(http://rev ...
- js 将很长的内容进行页面分页显示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- php 匹配替换中文
1.匹配中文 $str = "中文“; preg_match_all("/[\x{4e00}-\x{9fa5}]+/u",$str,$match); 2.替换中文: 在所 ...
- freeRTOS中文实用教程1--任务
1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性.本章主要讲述任务相关特性及调度相关的知识. 2. 任务的总体特点 任务的状态 (1)任务有两个状态,运行态和非运行态 (2)任务由非运行 ...
- 【转】snprintf()函数使用方法
众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf. 注:sprintf()函数:int sprintf( char *buffer, const ...
- 【转】OpenCV对图片中的RotatedRect进行填充
函数名:full_rotated_rect 函数参数: image输入图像,rect希望在图像中填充的RotatedRect,color填充的颜色 主要的思路是:先找到RotatedRect的四个顶点 ...
- day1 diff命令递归比较目录下的文件
一.diff实战 (1)递归比较文件夹下所有的文件及目录的不同 diff --brief -Nr dir1/ dir2/ Reference ...