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;
}

最新文章

  1. C#:安装Windows服务,动态指定服务名及描述
  2. spark-submit常用参数
  3. 浅谈JavaScript计时器
  4. java获取数据库里表的名字
  5. How Tomcat Works(十五)
  6. -_-#【video】
  7. greenplum和postgresql
  8. 【微服务轻量化容器技术相关】同事分享的Docker学习汇总
  9. jsp第1讲(上集)
  10. capwap学习笔记——初识capwap(三)(下)
  11. mkfs.ext4快速格式化大容量硬盘
  12. HTML中特殊符号的处理
  13. P4574 [CQOI2013]二进制A+B
  14. [UE4]增加开枪冷却时间, Get Time Seconds
  15. js检查字符串的包含关系
  16. Spring AspectJ切入点语法详解
  17. LS下怎样最大限度的提高Domino下Web应用的速度
  18. layui文件上传进度条(模拟)
  19. redis主从配置+sentinel哨兵
  20. Go从入门到精通(持续更新)

热门文章

  1. linux下载命令wget
  2. MySQL笔记5-----索引(覆盖索引等)
  3. PostgreSQL 安装配置 (亲测可用)
  4. Linux菜鸟成长日记 ( Linux 下的 ftp 文件传输协议 )
  5. omap 移植qt4.7.0
  6. 【codeforces 719E】Sasha and Array
  7. spring md5 加密
  8. 压力工具代码及epoll使用
  9. 使用Swift和SpriteKit写一个忍者游戏
  10. 宝马男砍人不慎刀落反被杀 防卫过当or故意伤害(在生命受到威胁的情况下,已经很难判断对方意图了,而且假如于莫是老弱妇幼,可能现在死的就是于莫了)