欢迎访问~原文出处——博客园-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 强连通缩点 动态规划的更多相关文章

  1. BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...

  2. BZOJ1179 [Apio2009]Atm 【tarjan缩点】

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4048  Solved: 1762 [Submit][Sta ...

  3. BZOJ1179 : [Apio2009]Atm 缩点+spfa

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2069  Solved: 826[Submit][Status ...

  4. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

  5. bzoj1179: [Apio2009]Atm scc缩点+dag上dp

    先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...

  6. BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )

    对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. ------------------------------------------------------ ...

  7. 【BZOJ-1179】Atm Tarjan + SPFA

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2407  Solved: 993[Submit][Status ...

  8. 【CCF】高速公路 tarjan强连通缩点

    [题意] 给定一个有向图,问图中互相可达(强连通)的点有多少对 [AC] 强连通缩点,缩点后是一个DAG,所以互相可达的点只在强连通块里. #include<iostream> #incl ...

  9. 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

随机推荐

  1. Python分析网页中的<a>标签

    soup = BeautifulSoup(html,"html.parser") html=soup.select("table a") for k in ht ...

  2. android contentprovider内容提供者

    contentprovider内容提供者:让其他app可以访问私有数据库(文件) 1.AndroidManifest.xml 配置provider <?xml version="1.0 ...

  3. 读取Excel中数据

    #region 读取导入Excel数据 /// <summary> /// /// </summary> /// <param name="filename&q ...

  4. Linux之Ubuntu无线网络配置

    无线网络使用问题: 0.插上有线网络电线与电脑NIC上. 1.set->系统设置->软件和更新->Ubuntu软件->下载自:   选择一个网络服务器地址(软件源)[http: ...

  5. Python字符串解析方法汇总

    Python字符串方法解析 1.capitalize 将首字母大写,其余的变成小写 print('text'.capitalize()) print('tExt'.capitalize()) 结果: ...

  6. Spring源码学习资料

    未完待续.. github地址 https://github.com/spring-projects 学习地址 https://github.com/code4craft/tiny-spring 推荐 ...

  7. iOS性能优化技巧

    通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化.结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化. 一.view优化 1.不透明的View 设置 ...

  8. shiroWeb项目-记住我(自动登陆实现)(十五)

    用户登陆选择“自动登陆”本次登陆成功会向cookie写身份信息,下次登陆从cookie中取出身份信息实现自动登陆. 用户身份实现java.io.Serializable接口便于反序列化 package ...

  9. linux笔记_day04

    1.cat 连接并显示 -n 显示行号 -E END 显示行尾 2.tac 从后往前显示 3.ctrl +C 4.more 向后翻  到最后会退出 5.less 翻到最后不退出 常用 支持b k sp ...

  10. python cookbook 笔记二

    去重和排序: #coding=utf-8 def dedupe(items): seen = set() for item in items: if item not in seen: yield i ...