【模板】Tarjan缩点
2024-09-07 16:14:36
洛谷3387
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=,maxm=;
int ans,n,m,etot,tot,top,color,last[maxn],w[maxn],f[maxn],val[maxn],dfn[maxn],low[maxn],col[maxn],st[maxn];
struct edge{int pre,to;}e[maxm];
struct rec{int x,y;}a[maxm];
void read(int &k){
k=; int f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
k*=f;
}
int max(int a,int b){if (a>b) return a; return b;}
int min(int a,int b){if (a<b) return a; return b;}
void add(int x,int y){e[++etot]=(edge){last[x],y}; last[x]=etot;}
void tarjan(int x){
dfn[x]=low[x]=++tot; st[++top]=x;
for (int i=last[x],to;i;i=e[i].pre)
if (!dfn[to=e[i].to]) tarjan(to),low[x]=min(low[x],low[to]);
else if (!col[to]) low[x]=min(low[x],dfn[to]);
if (dfn[x]==low[x])
for(color++;st[top+]!=x;top--) col[st[top]]=color,val[color]+=w[st[top]];
}
void dfs(int x){
if (f[x]) return; f[x]=val[x]; int tmp=;
for (int i=last[x],to;i;i=e[i].pre) dfs(to=e[i].to),tmp=max(tmp,f[to]);
f[x]+=tmp;
}
int main(){
read(n); read(m);
for (int i=;i<=n;i++) read(w[i]);
for (int i=;i<=m;i++) read(a[i].x),read(a[i].y),add(a[i].x,a[i].y);
for (int i=;i<=n;i++) if (!dfn[i]) tarjan(i);
etot=; memset(last,,sizeof(last));
for (int i=,x,y;i<=m;i++) if(col[x=a[i].x]!=col[y=a[i].y]) add(col[x],col[y]);
for (int i=;i<=color;i++) dfs(i),ans=max(ans,f[i]);
return printf("%d\n",ans),;
}
最新文章
- mybatis配置-返回date类型丢失时间
- 古典问题rabbit
- 前端见微知著JavaScript基础篇:this or that ?
- Meta标签实现阻止移动设备(手机、Pad)的浏览器双击放大网页
- list 和 str
- Java transient关键字序列化时使用小记
- JavaWeb学习记录(六)——用户登录功能
- 黄聪:C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果) (转)
- ORA-01810格式代码出现两次 的解决方案
- phonegap安卓环境下使用BarcodeScanner插件扫描二维码教程
- js判断undefined类型,undefined,null,NaN的区别
- iOS页面间传值的六种方式
- js中的sort方法
- linux下各种解压方法
- es6编程建议和技巧点汇总
- ABP使用Miniprofiler监测EF
- python之装饰器函数
- 20180318 一个VS2015运行DataTable问题
- 【转】每天一个linux命令(45):free 命令
- Hbase和传统数据库的区别