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全国联赛提 ...
随机推荐
- anaconda下安装xgboost
1.下载whl文件 网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 选择合适自己的环境的下载,比如python3.6还是3.5的,64位机 ...
- 数据库之JDBC入门
数据表: 代码实现(注:jar包用的8.0版本) import java.sql.*; import java.util.Scanner; public class MyDatabase { publ ...
- java基础口述
1:什么是变量?变量的定义格式?要使用变量需要注意什么? 在程序运行过程中,其值是可以在某个范围内发生改变的量. 变量其实就是内存中一小块区域. 由3部分组成: 1,数据类型: 限定变量的取值 2,变 ...
- maven引入spring相关依赖
<!--spring相关包--> <dependency> <groupId>org.springframework</groupId> <art ...
- switch 的穿透, 以及穿透利用
switch 穿透测试: outputs: 添加break 阻止switch穿透: outputs: 利用switch的穿透功能:
- JAVA的基本数据类型和引用数据类型的区别
引用数据类型: 类.接口类型.数组类型.枚举类型.注解类型: 基本数据类型和引用数据类型的区别: 基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上: 引用数据类型在被创 ...
- File System Design Case Studies
SRC=http://www.cs.rutgers.edu/~pxk/416/notes/13-fs-studies.html Paul Krzyzanowski April 24, 2014 Int ...
- 关于excel导出
转载自:https://blog.csdn.net/ljj_9/article/details/50395688 //一个excel表格: HSSFWorkbook wb = new HSSFWork ...
- Visual C++ 经常使用快捷键
大写和小写 Ctrl+Shift+U: 所有变为大写 Ctrl+U: 所有变为小写 凝视 Ctrl+K+Crtr+C: 凝视选定内容 Ctrl+K+Crtr+U: 取消选定凝视内容 折叠 折叠代码: ...
- jQuery Video Extend
HTML5视频扩展插件 能够加入Logo 加入标记 用法: 下载:jquery-video-extend <script src="js/jquery-2.1.4.min.js&quo ...