Time:2016.05.21
Author:xiaoyimi
转载注明出处谢谢


传送门
思路:
题目中是一个带点权的有向图,如果这是一个没有环的图那么问题就很简单,拓扑或者直接求最长(短)路径什么的信手拈来,但是它有环,这就要求我们对图进行重构,把它搞成一个有向无环图,然后求得极值路径就可以了
tarjan缩点重构图,然后在重构图上跑最长(短)路,最后的答案就是max(dis[有酒吧的点])
注意:
1.还是要注意,重构图和原图不能搞混了……
2.如果跑最长路的话,dis不要初始化为0,可能出现起点周围的点权都是0,直接导致从起点搜索一遍,没有点入队的情况
代码:

#include<bits/stdc++.h>
using namespace std;
#define M 500005
int in()
{int t=0;char ch=getchar();while (!isdigit(ch)) ch=getchar();while (isdigit(ch)) t=(t<<1)+(t<<3)+ch-48,ch=getchar();return t;
}
int n=in(),m=in(),s,p,tot,cnt;
struct edge{int u,v,next;}e[M],E[M];
int first[M],c[M],dfn[M],low[M],belong[M],First[M],C[M],dis[M];
bool is_end[M],vis[M];
stack<int>S;
queue<int>Q;
void add(int y,int x){e[++tot]=(edge){x,y,first[x]};first[x]=tot;}
void Add(int x,int y){E[++tot]=(edge){x,y,First[x]};First[x]=tot;}
void dfs(int x)
{dfn[x]=low[x]=++cnt;S.push(x);vis[x]=1;for (int i=first[x];i;i=e[i].next)if (!dfn[e[i].v])dfs(e[i].v),low[x]=min(low[x],low[e[i].v]);else if (vis[e[i].v])low[x]=min(low[x],dfn[e[i].v]);if (dfn[x]==low[x]){C[x]=0;for (int y=-1;y!=x;y=S.top(),S.pop())belong[S.top()]=x,C[x]+=c[S.top()],vis[S.top()]=0;}
}
main()
{for (int i=1;i<=m;i++) add(in(),in());for (int i=1;i<=n;i++) c[i]=in();s=in();p=in();for (int i=1;i<=p;i++) is_end[in()]=1;tot=0;for (int i=1;i<=n;i++)if (!dfn[i]) dfs(i);for (int i=1;i<=n;i++)for (int j=first[i];j;j=e[j].next)if (belong[i]!=belong[e[j].v])Add(belong[i],belong[e[j].v]);memset(dis,63,sizeof(dis));Q.push(belong[s]);vis[belong[s]]=1;dis[belong[s]]=-C[belong[s]];while (!Q.empty()){int x=Q.front();Q.pop();vis[x]=0;for (int i=First[x];i;i=E[i].next)if (dis[x]-C[E[i].v]<dis[E[i].v]){dis[E[i].v]=dis[x]-C[E[i].v];if (!vis[E[i].v]) Q.push(E[i].v),vis[E[i].v]=1;}}int ans=0;for (int i=1;i<=n;i++)if (is_end[i]) ans=min(ans,dis[belong[i]]);printf("%d",-ans);
}

【BZOJ1179】atm,tarjan缩点+最长路径相关推荐

  1. BZOJ1179【APOI2009】ATM Tarjan

    ATM Time Limit: 15 Sec Memory Limit: 162 MB Description Siruseri城中的道路都是单向的.不同的道路由路口连接.按照法律规定,在每个路口都设 ...

  2. 洛谷P4742(tarjan缩点+拓扑DP)

    https://www.luogu.org/problemnew/show/P4742 题目背景 [Night - 20:02[Night−20:02 P.M.]P.M.] 夜空真美啊--但是--快要 ...

  3. 【Codeforces】894E.Ralph and Mushrooms Tarjan缩点+DP

    题意 给定$n$个点$m$条边有向图及边权$w$,第$i$次经过一条边边权为$w-1-2.-..-i$,$w\ge 0$给定起点$s$问从起点出发最多能够得到权和,某条边可重复经过 有向图能够重复经过 ...

  4. BZOJ1179【tarjan】【spfa】

    tarjan缩点.然后用spfa找最长路. /* I will wait for you */#include<cstdio> #include<cstdlib> #inclu ...

  5. [POJ3249]Test for Job [拓扑排序+DAG上的最长路径]

    给定一张带点权的DAG 求一条入度为0节点到出度为0节点的最长路 把点权转化为边权(同时多源转化成单源):边u->v的权值为W[v],这样入度为0的节点权值会被遗漏,新开一个点0向入度为0的点u ...

  6. 算法提高课-动态规划-树形DP-AcWing 1072. 树的最长路径:dfs写法

    题目分析 来源:acwing 分析: 树的最长直径:距离最远的两个点之间的距离,这里是带边权的情况. 在没有边权(或者边权都是1)的时候,树的直径也是最远两个点的距离. 样例对应的树如下,树的直径= ...

  7. 201503-4 网络延时 (本质是求树的最长路径)

    树的最长路径 题目: 思路: 求解方法: 动态规划三部曲 1)状态定义 2)状态转移方程 (1)ACWing上的问题 (2) POJ上的问题 (3) CCF-CSP上的问题 参考博文: <1&g ...

  8. BZOJ 1051 受欢迎的牛(Tarjan缩点)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4573  Solved: 2428 [Submit][S ...

  9. 【图论】Tarjan 缩点

    [Tarjan]缩点 在一个点N数据极大的图中,直接SPFA或者记忆花搜索时间超限,那么我们可以利用Tarjan缩点来减少N. 举个例子: 如上图:3,6两点为该图中的强连通分量,我们可以将它们看做一 ...

最新文章

  1. 全国英语计算机9月统考2019,2019年9月网络教育统考《计算机应用基础》模拟题6...
  2. php slaveokay 设置,PHP: MongoCursor::slaveOkay - Manual
  3. [HNOI2011]数学作业
  4. 博图组态显示未分配的设备_S71200CPU做IO共享设备的配置方法【图文】
  5. php漂亮按钮代码,分享一款金属感十足的按钮样式代码
  6. 【优化求解】基于matlab遗传算法求解电力系统最优潮流问题【含Matlab源码 437期】
  7. 【Adobe美术基础】字体安装
  8. 计算机并行配置,windows10无法启动应用程序提示并行配置不正确解决方法
  9. idea如何做到多模块开发项目
  10. 虚拟化技术(2)系统虚拟化
  11. 【每日微信新闻早报简报】10月11日 星期五
  12. SWF文件格式详解(1)
  13. 闲云野鹤:吃鸡(三)之场景制作:制作毒圈
  14. 美国国土安全部重点努力加强国家关键基础设施的网络安全
  15. 一个老兵的linux学习和面试经验分享 【转载】
  16. 简易的web全栈开发——服务器部分
  17. 高斯混合分布EM算法
  18. 西北乱跑娃 --- bottle web框架技术讨论
  19. 马尔可夫链(Markov chain)
  20. PAT练习 客似云来

热门文章

  1. 【华为云技术分享】昇腾AI处理器软件栈--总览
  2. 【华为云实战开发】8.如何快速搭建C#网站并实现持续集成?
  3. c语言方阵的转置程序,C程序查找矩阵的转置
  4. python编程试题单词倒排_Python:将句子中的单词全部倒排过来,但单词的字母顺序不变...
  5. axure命令行_axure怎么做计算器
  6. 代数学笔记3: 分裂域
  7. C++ STL容器vector篇(四) vector容器交换, 预留空间
  8. 计算机图形学E9——裁剪——固定矩形窗口裁剪多边形(凸多边形/凹多边形)
  9. AI开发者顶会,这一次,人人都可以参加!
  10. android 关闭软键盘_实现边到边的体验 | 让您的软键盘动起来 (一)