tarjan 算法求强连通分量
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int P=1e6;
const int N=2e6+;
const int M=2e6+;
const int inf=0x3f3f3f3f;
struct edge
{
int f,t,next;
ll v;
}e[M];
int n,m,tot,all,s,cnt,head[N],dfn[N],low[N],st[N],id[N];
int dindex;
bool inst[N];
ll num[N],sum[],val[N];
void add(int f,int t,ll v)
{
e[tot].f=f; e[tot].t=t; e[tot].v=v;
e[tot].next=head[f]; head[f]=tot++;
}
void tarjan(int v)
{
dindex++;
dfn[v]=low[v]=dindex;
st[all++]=v; inst[v]=true;
for(int i=head[v];~i;i=e[i].next)
{
int nx=e[i].t;
if(!dfn[nx])
{
tarjan(nx);
low[v]=min(low[v],low[nx]);
}
else if(inst[nx]) low[v]=min(low[v],dfn[nx]);
}
if(dfn[v]==low[v])
{
cnt++;
while()
{
int cur=st[--all];
inst[cur]=false;
id[cur]=cnt;
if(cur==v) break;
}
}
}
ll work(ll x)
{
ll ans=;
int item=lower_bound(num,num+,x)-num;
ans-=sum[item];
ans+=x*(item+);
ans+=num[item]-x;
return ans;
}
ll dfs(int v)
{
ll res=;
dfn[v]=;
for(int i=head[v];~i;i=e[i].next)
{
int nx=e[i].t;
if(!dfn[nx]) res=max(res,e[i].v+dfs(nx));
else res=max(res,val[nx]+e[i].v);
}
val[v]+=res;
return val[v];
}
int main()
{
num[]=; cnt=; all=; tot=; dindex=;
for(int i=;i<=;i++) num[i]=num[i-]+i,sum[i]=sum[i-]+num[i];
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int f,t; ll v;
scanf("%d%d%lld",&f,&t,&v);
add(f,t,v);
}
scanf("%d",&s);
tarjan(s);
int up=tot;
for(int i=;i<up;i++)
{
int a=e[i].f,b=e[i].t;
if(!id[a] || !id[b]) continue;
if(id[a]==id[b]) val[id[a]+P]+=work(e[i].v);
else if(id[a]<id[b]) add(id[b]+P,id[a]+P,e[i].v);
else add(id[a]+P,id[b]+P,e[i].v);
}
ll ans=dfs(id[s]+P);
printf("%lld\n",ans);
return ;
}
tarjan 算法求强连通分量的更多相关文章
- HDU 1269 迷宫城堡 tarjan算法求强连通分量
基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...
- Tarjan 算法求 LCA / Tarjan 算法求强连通分量
[时光蒸汽喵带你做专题]最近公共祖先 LCA (Lowest Common Ancestors)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili tarjan LCA - YouTube Tarj ...
- [学习笔记] Tarjan算法求强连通分量
今天,我们要探讨的就是--Tarjan算法. Tarjan算法的主要作用便是求一张无向图中的强连通分量,并且用它缩点,把原本一个杂乱无章的有向图转化为一张DAG(有向无环图),以便解决之后的问题. 首 ...
- 【算法】Tarjan算法求强连通分量
概念: 在有向图G中,如果两个定点u可以到达v,并且v也可以到达u,那么我们称这两个定点强连通. 如果有向图G的任意两个顶点都是强连通的,那么我们称G是一个强连通图. 一个有向图中的最大强连通子图,称 ...
- tarjan算法求强连通分量
先上代码: #include <iostream> #include <cstring> #include <vector> #include <stack& ...
- Tarjan算法分解强连通分量(附详细参考文章)
Tarjan算法分解强连通分量 算法思路: 算法通过dfs遍历整个连通分量,并在遍历过程中给每个点打上两个记号:一个是时间戳,即首次访问到节点i的时刻,另一个是节点u的某一个祖先被访问的最早时刻. 时 ...
- kosaraju算法求强连通分量
什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达,那么我们说s与t是强连通的. ...
- Tarjan模板——求强连通分量
Tarjan求强连通分量的流程在这个博客讲的很清楚,再加上我也没理解透,这里就不写了. 缩点:将同一个连通块内的点视为同一个点. 扔一道模板题:codeVS2822爱在心中 第一问很显然就是求点数大于 ...
- tarjan算法(强连通分量 + 强连通分量缩点 + 桥(割边) + 割点 + LCA)
这篇文章是从网络上总结各方经验 以及 自己找的一些例题的算法模板,主要是用于自己的日后的模板总结以后防失忆常看看的, 写的也是自己能看懂即可. tarjan算法的功能很强大, 可以用来求解强连通分量, ...
随机推荐
- TestNg失败重试机制
TestNg提供了失败重试接口IRetryAnalyzer,需要实现retry方法: package com.shunhe.testngprac.retry; import org.testng.IR ...
- Python XML操作
XML(可扩展性标记语言)是一种非常常用的文件类型,主要用于存储和传输数据.在编程中,对XML的操作也非常常见. 本文根据python库文档中的xml.etree.ElementTree类来进行介绍X ...
- luogu 1631 序列合并
priority_queue的使用,注意 a[1]+b[1],a[1]+b[2],a[1]+b[3],a[1]+b[4].......a[1]+b[n] a[2]+b[1]......... .. a ...
- C# 面向对象的new关键字的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- CSS —— 选择器
选择器种类 标签选择器 id选择器 类选择器 通配符 交集选择器 并集选择器 后代选择器 子代选择器 选择器设置样式优先级 默认样式 < 继承样式 < 通配符设置样式 < 标签选择器 ...
- 2016年1月7日 隐藏NavigationBar时的一个坑
http://www.jianshu.com/p/efb960fed457 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear: ...
- Python的虚拟环境virtualenv
原文地址:blog.sina.com.cn/s/blog_4ddef8f80101eu0w.html Python的虚拟环境可以使一个Python程序拥有独立的库library和解释器interpre ...
- Adjoint of SE(3)
以前看的书都提到 SE(3) 和 se(3) 的 Adjoint,但是并没有讲这个东西是干什么用的,只是给了一堆性质.这东西来自群论. 参考 Lie Groups for 2D and 3D Tran ...
- html 速查表
HTML 速查列表 HTML 速查列表. 你可以打印它,以备日常使用. HTML 基本文档 <!DOCTYPE html> <html> <head> <ti ...
- Java并发编程--并发容器之Collections
在JDK1.2之前同步容器类包括Vector.Hashtable,这两个容器通过内置锁synchronized保证了同步.后面的ArrayList.LinkedList.HashMap.LinkedH ...