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全国联赛提 ...
随机推荐
- JS 100以内的质数、只能被1和自己整除
for(var i = 2;i <= 100;i++){ var biao = 1; for(var j = 2;j < i;j++){ if(i%j == 0){ biao = 0; } ...
- 数据库之JDBC入门
数据表: 代码实现(注:jar包用的8.0版本) import java.sql.*; import java.util.Scanner; public class MyDatabase { publ ...
- Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)A. Friends Meeting
Two friends are on the coordinate axis Ox in points with integer coordinates. One of them is in the ...
- PostgreSQL 安装配置 (亲测可用)
转自:http://blog.csdn.net/jesseyoung/article/details/41348835 受作者博客限制,请访问上面的链接 ---------- 下面是另一个转载 --- ...
- 02.OOP面向对象-3.一些理解
对封装的理解? 封装,类本身就是一个封装,封装了属性和方法.方法也是封装,对一些业务逻辑的封装.私有也是封装,将一些方法和属性私有化,对外提供可访问的接口. 对继承的理解 将共性的内容放在父类中,子类 ...
- 00074_Array类
1.Array类的概述 此类包含用来操作数组(比如排序和搜索)的各种方法.需要注意,如果指定数组引用为 null,则访问此类中的方法都会抛出空指针异常NullPointerException. 2.常 ...
- SSH框架整合截图总结(三)
联系人信息查询1 点击 联系人信息查询 超链接时候,到查询页面 (1)在查询页面中,选择客户,根据客户进行查询 下拉表框显示所有客户 可以根据所属的客户进行联系人查询 2 在查询页面中,输入值,提 ...
- 百度url 参数详解全
百度url解析Joe.Smith整理大全 百度url解析Joe.Smith整理大全...1 本文链接:http://blog.csdn.net/qq_26816591/article/details/ ...
- C# string bytes互转
string str = "spike"; byte[] bytes = System.Text.Encoding.Default.GetBytes(str); foreach ( ...
- 杭电(hdu)ACM 4548 美素数
美素数 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submis ...