CF894E Ralph and Mushrooms_强连通分量_记忆化搜索_缩点
Code:
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
const int maxn = 1000000 + 3;
stack<int>S;
int head[maxn], nex[maxn], val[maxn], to[maxn], cnt, n, m, s;
int low[maxn], dfn[maxn], vis[maxn], answer[maxn], idx, scc;
long long quan[maxn];
inline void add_edge(int u, int v, int c)
{
nex[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
val[cnt] = c;
}
void tarjan(int u)
{
vis[u] = 1;
S.push(u);
low[u] = dfn[u] = ++scc;
for(int v = head[u]; v ; v = nex[v])
{
if(!vis[to[v]])
{
tarjan(to[v]);
low[u] = min(low[u], low[to[v]]);
}
else if(!answer[to[v]]) low[u] = min(low[u], dfn[to[v]]);
}
if(low[u] == dfn[u])
{
++idx;
for(;;)
{
int x = S.top(); S.pop();
answer[x] = idx;
if(x == u) break;
}
}
}
struct Math
{
long long sum[100097];
long long C[100097];
inline void init()
{
sum[0] = -1;
for(int i = 2;i <= 100007; ++i) sum[i] = sum[i - 1] + i - 1;
for(int i = 1;i <= 100007; ++i) C[i] = sum[i] + C[i - 1]; //第 (i + 1) 项的总和
}
inline long long get(int w)
{
int l = 1, r = 100000, ans = 0;
while(l <= r)
{
int mid = (l + r) >> 1;
if(sum[mid] <= w) ans = mid, l = mid + 1;
else r = mid - 1;
}
return (long long) ans * w - C[ans];
}
}M;
int head2[maxn], to2[maxn << 1], nex2[maxn << 1], cnt2, val2[maxn];
inline void add_edge2(int u,int v, int c)
{
nex2[++cnt2] = head2[u];
head2[u] = cnt2;
to2[cnt2] = v;
val2[cnt2] = c;
}
long long final[maxn];
long long dp(int u)
{
if(final[u] != -1) return final[u];
final[u] = quan[u];
for(int v = head2[u]; v ; v = nex2[v])
{
final[u] = max(final[u], quan[u] + val2[v] + dp(to2[v]));
}
return final[u];
}
int main()
{
scanf("%d%d",&n,&m);
M.init();
for(int i = 1;i <= m; ++i)
{
int a, b, c;
scanf("%d%d%d",&a, &b, &c);
add_edge(a, b, c);
}
scanf("%d",&s);
for(int i = 1;i <= n; ++i)
{
if(!vis[i]) tarjan(i);
}
for(int i = 1;i <= n; ++i)
{
for(int v = head[i]; v ; v = nex[v])
{
if(answer[i] == answer[to[v]])
{
quan[answer[i]] += M.get(val[v]);
}
else
{
add_edge2(answer[i], answer[to[v]], val[v]);
}
}
}
memset(final, -1, sizeof(final));
printf("%I64d",dp(answer[s]));
return 0;
}
CF894E Ralph and Mushrooms_强连通分量_记忆化搜索_缩点的更多相关文章
- [bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划
食物链 bzoj-4562 Haoi-2016 题目大意:给你n个点,m条边的DAG,求所有的满足条件的链,使得每条链的起点是一个入度为0的点,中点是一条出度为0的点. 注释:$1\le n\le 1 ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- poj 1088 滑雪_记忆化搜索
题意:略 直接用记忆化搜索就行了 #include<cstdio> #include<iostream> using namespace std; int n,m; int m ...
- 洛谷 p2618 数字工程 记忆化搜索_ 线性筛
我们在线筛的同时处理出每个数的所有质因子,记忆化搜索的时候直接枚举质因子即可. 时间复杂度为 O(nlogn)O(nlogn)O(nlogn) Code: #include<cstdio> ...
- UVa 10599【lis dp,记忆化搜索】
UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...
- ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)
题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...
- LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)
题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多. 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以 ...
- poj3592 强连通+记忆化搜索
题意:有一片 n*m 的矿地,每一格有矿.或这传送门.或者挡路岩石.除了岩石不能走以外,其他的格子都能够向右或向下走,走到一个非岩石的格子.对于每一个矿点,经过它就能得到它的所有矿石,而对于每一个传送 ...
- Codevs_1017_乘积最大_(划分型动态规划/记忆化搜索)
描述 http://codevs.cn/problem/1017/ 给出一个n位数,在数字中间添加k个乘号,使得最终的乘积最大. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提 ...
随机推荐
- CentOS7安装GitLab、汉化、邮箱配置及使用(转载)
同步首发: https://www.cnblogs.com/heyonggang/p/7778203.html http://www.yuanrengu.com/index.php/20171112. ...
- javase 超市库存系统
package com.oracle.demo01; import java.util.ArrayList; import java.util.Scanner; public class Demo01 ...
- 洛谷P2827 蚯蚓 队列 + 观察
我们不难发现先被切开的两半一定比后被切开的两半大,这样就天然的生成了队列的单调性,就可以省去一个log.所以,我们开三个队列,分别为origin,big,smallorigin, big, small ...
- jmeter搭建
jdk 1.8的地址 链接:https://pan.baidu.com/s/1eEyYbzo1Tfbvbmf_vN2yUA 密码:6dxi 1.安装JDK 选择安装目录 安装过程中会出现两次 安装提 ...
- tsar源码分析
从modules/mod_cpu.c入手 ./devel/tsar.h module 结构体: struct module { char name[LEN_32]; char opt_line[LEN ...
- django rest-farme-work 的使用(1)
Django REST框架是一个用于构建Web API的强大且灵活的工具包 您可能想要使用REST框架的一些原因: 可浏览性 身份认证 支持ORM和非ORM的序列化 良好的文档支持 安装初步 pip ...
- TFRecords转化和读取
标准TensorFlow格式 TensorFlow的训练过程其实就是大量的数据在网络中不断流动的过程,而数据的来源在官方文档[^1](API r1.2)中介绍了三种方式,分别是: Feeding.通过 ...
- [SharePoint][SharePoint 2013从入门到精通]Chapter 1 介绍 SharePoint2013
本章你讲学到 什么是SharePoint2013 SharePoint2013如何加强协作与共享 SharePoint2013中有什么用户权限 什么是SharePoint Online 本地部署与在线 ...
- SDWebImage源代码解析(二)
上一篇:SDWebImage源代码解析(一) 2.缓存 为了降低网络流量的消耗.我们都希望下载下来的图片缓存到本地.下次再去获取同一张图片时.能够直接从本地获取,而不再从远程server获取.这样做的 ...
- git-osc自己定义控件之:CircleImageView
git-osc自己定义控件之:CircleImageView 一.CircleImageView的使用 在项目中能够发现,用户的头像都是圆形的.感觉非常好奇,昨天最终发现了,原来是自定了一个Image ...