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全国联赛提 ... 
随机推荐
- 路飞学城Python-Day100
			Django项目之图书馆项目 1.项目架构 2.表结构设计 from django.db import models # Create your models here. #作者详情表 class A ... 
- 路飞学城Python-Day96
			51-数据库表关系之一对多 为什么有多表的概念? 一个Book有单表的时候只能查询Book表中的内容,要想查询更多的出版社的信息,需要再将单表的内容不断更新 导致单表会存储大量的重复的信息,浪费了大量 ... 
- redis 安装成功后外部服务器链接不上
			1.reids服务器的6379端口telnet不通 2. 查看reids进程和端口,都是存在的.只是ip地址是127.0.0.1而不是0.0.0.0,只是本机能使用 3.查找redis的配置文件red ... 
- js阻止点击事件的冒泡的实现
			<html> <head> <script type="text/javascript"> function fnclick1(){ alert ... 
- Java基础学习总结(61)——Java项目开发要注意的60个问题
			1. 首先写代码的时候最好不要有缺陷.最好的修复方法就是让 bug 胎死腹中. 良好的单元测试 强制数据库约束 使用输入验证框架 避免未实现的"else"条件 在应用到主程序之前知 ... 
- I - Agri-Net
			I - Agri-Net poj 1258 注意:多组数据输入. #include<cstdio> #include<cstring> #include<iostream ... 
- 详解Mysql分布式事务XA(跨数据库事务)
			详解Mysql分布式事务XA(跨数据库事务) 学习了:http://blog.csdn.net/soonfly/article/details/70677138 mysql执行XA事物的时候,mysq ... 
- jQuery的CSS操作
			.css()--获取匹配元素集合中的第一个元素的样式属性的值设置每一个匹配元素的一个或多个CSS属性. .hasClass()--确定不论什么一个匹配元素是否有被分配给定的(样式)类: .addCla ... 
- winform显示系统托盘,双击图片图表显示窗体,退出窗体是否提示
			private void Form1_FormClosing(object sender, FormClosingEventArgs e) { DialogResult result = Messag ... 
- 使用roslyn编译website项目
			在Nuget中,添加Microsoft.CodeDom.Providers.DotNetCompilerPlatform. 在添加这个dll的时候,会自动在web.config中添加以下内容 < ... 
