.....
我真是个大菜鸡,辣鸡,菜逼....
模版题
将强连通分量缩点,在DAG上DP就行了
然后
(以下是各种智障错误)
因为缩点后新建图
变量名是大写
各种写成小写
加边只加了强连通分量中的一个点
给自己到自己连了条边
在void函数写了个return f[u]
我真是个辣鸡
#include<cstdio> #include<algorithm> #include<stack> using namespace std; const int N=1e4+5; const int M=2e5+5; int n,m; struct edge { int to,next; }e[M],E[M]; int head[N],ecnt,HEAD[N],ECNT,fa[N]; int val[N],sum[N],f[N],ans; int dfn[N],low[N],ti,id[N]; bool inq[N]; stack<int>stk; void add(int u,int v) { e[++ecnt].to=v;e[ecnt].next=head[u];head[u]=ecnt; } void ADD(int u,int v) { //printf("%d->%d ",u,v); E[++ECNT].to=v;E[ECNT].next=HEAD[u];HEAD[u]=ECNT;id[v]++; } void tarjan(int u) { dfn[u]=low[u]=++ti; stk.push(u);inq[u]=1; for(int i=head[u],v;i;i=e[i].next) { if(!dfn[v=e[i].to]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(inq[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { int t; do { t=stk.top(); stk.pop(); inq[t]=0; fa[t]=u; sum[u]+=val[t]; }while(t!=u); //printf("%d->%d ",u,sum[u]); } } void dfs(int u) { for(int i=HEAD[u],v;i;i=E[i].next) { dfs(v=E[i].to); f[u]=max(f[u],f[v]+sum[u]); } //printf("%d:%d ",u,f[u]); f[u]=max(f[u],sum[u]); ans=max(ans,f[u]); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&val[i]); for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),add(u,v); for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); for(int u=1,v;u<=n;u++) { for(int i=head[u];i;i=e[i].next) { if(fa[u]!=fa[v=e[i].to]) ADD(fa[u],fa[v]); } } for(int u=1;u<=n;u++)if(fa[u]==u && id[u]==0)dfs(u); printf("%d ",ans); return 0; }