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_强连通分量_记忆化搜索_缩点的更多相关文章

  1. [bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划

    食物链 bzoj-4562 Haoi-2016 题目大意:给你n个点,m条边的DAG,求所有的满足条件的链,使得每条链的起点是一个入度为0的点,中点是一条出度为0的点. 注释:$1\le n\le 1 ...

  2. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  3. poj 1088 滑雪_记忆化搜索

    题意:略 直接用记忆化搜索就行了 #include<cstdio> #include<iostream> using namespace std; int n,m; int m ...

  4. 洛谷 p2618 数字工程 记忆化搜索_ 线性筛

    我们在线筛的同时处理出每个数的所有质因子,记忆化搜索的时候直接枚举质因子即可. 时间复杂度为 O(nlogn)O(nlogn)O(nlogn) Code: #include<cstdio> ...

  5. UVa 10599【lis dp,记忆化搜索】

    UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...

  6. ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)

    题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...

  7. LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)

    题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多. 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以 ...

  8. poj3592 强连通+记忆化搜索

    题意:有一片 n*m 的矿地,每一格有矿.或这传送门.或者挡路岩石.除了岩石不能走以外,其他的格子都能够向右或向下走,走到一个非岩石的格子.对于每一个矿点,经过它就能得到它的所有矿石,而对于每一个传送 ...

  9. Codevs_1017_乘积最大_(划分型动态规划/记忆化搜索)

    描述 http://codevs.cn/problem/1017/ 给出一个n位数,在数字中间添加k个乘号,使得最终的乘积最大. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提 ...

随机推荐

  1. a标记地址的几种用法

    1.<a href="tel://号码"></a> 手机使用能自动拨打电话 //可以省略 2.<a href="mailto://邮箱&qu ...

  2. 计蒜客 时间复杂度 (模拟) & 洛谷 P3952 时间复杂度

    链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...

  3. Python爬虫基础--爬取车模照片

    import urllib from urllib import request, parse from lxml import etree class CarModel: def __init__( ...

  4. Python设计模式--单例模式(懒汉式)

    1. 单例模式 --> 单一(唯一)的实例. 在整个运行时间内, 内存中只有一个对象, 一般该对象涉及网络,资源等操作. 2. 单例模式一般分为懒汉式和饿汉式 懒汉式内存占用更加合理. 3. 调 ...

  5. 在数据表中字段存有excel、word文件数据,让其随着记录指针移动而改变显示

    这是一个及其简单的问题,可是被绕住了.当记录移动时,装载数据到excel显示数据.这个方法写在哪里?如何触发? datasource.cds等空间的触发都是多次.到现在也没明白如何去做.笨方法: 1. ...

  6. 将 excel文件数据导入MySQL数据库中

    第一步:先将Excel文件另存为文本文件(制表符分割) 第二步:将生成的txt文件另存,并修改编码格式utf8; 第三步:将文件放到指定位置,或自己想要的位置: G:\city.txt 第四步:避免创 ...

  7. ElasticSearch 深度分页解决方案

    常见深度分页方式 from+size 另一种分页方式 scroll scroll + scan search_after 的方式 es 库 scroll search 的实现 常见深度分页方式 fro ...

  8. 解决VTune错误PMU resources currently being used by another profiling tool or process

    错误信息: When I ran Hardware Event-based Sampling Analysis 0, it showed the ERROR: Collection failed Co ...

  9. 剑指Offer面试题33(java版):把数组排成最小的数

    题目:输入一个正整数数组.把数组里面全部的数字拼接排成一个数,打印能拼接出的全部数字中的一个.比如输入数组{3,32.321}.则打印出这3个数字能排成的最小数字321323. 这个题目最直接的做法应 ...

  10. 【解决方法】UITableView 性能优化笔记

    1.网络图片异步载入,SDWebImage. 2.文字直接 drawInRect/drawAtPoint 绘制,參考 ABTableViewCell.AdvancedTableViewCells. 3 ...