P3387 缩点模板
1,3,4,5,7MLE求调
全是静态数组怎么会MLE啊
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define rev(x) reverse(x.begin(),x.end())
using namespace std;
//不是 哥们
int n,m,ans;
int dval[10005];
int alg[10005],algt;
int cnum,col[10005],cval[10005];
int xlis[100005],ylis[100005];
int dp[10005];
bool vis[10005];
struct edge{int to,nxt;};
edge e[100005];int head[10005],cnt;
//全是静态数组怎么会MLE啊。。
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline void add(int x,int y){
e[cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt++;
}
inline void dfs1(int x){
vis[x]=1;
for(int i=head[x];i!=-1;i=e[i].nxt) if(!vis[e[i].to]) dfs1(e[i].to);
alg[++algt]=x;
}
inline void dfs2(int x){
col[x]=cnum;
cval[cnum]+=dval[x];
for(int i=head[x];i!=-1;i=e[i].nxt) if(!col[e[i].to]) dfs2(e[i].to);
}
inline void dfs3(int x){
if(dp[x]) return;
for(int i=head[x];i!=-1;i=e[i].nxt){if(!dp[e[i].to]) dfs3(e[i].to);dp[x]=max(dp[x],dp[e[i].to]);}
dp[x]+=cval[x];
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++) dval[i]=read();
for(int i=1;i<=m;i++) xlis[i]=read(),ylis[i]=read();
//建正图
memset(head,-1,sizeof head);cnt=0;
for(int i=1;i<=m;i++) add(xlis[i],ylis[i]);
//搜1
for(int i=1;i<=n;i++) if(!vis[i]) dfs1(i);
//建反图
memset(head,-1,sizeof head);cnt=0;
for(int i=1;i<=m;i++) add(ylis[i],xlis[i]);
//搜2
for(int i=n;i>=1;i--) if(!col[alg[i]]) cnum++,dfs2(i);
//建联通分量图
memset(head,-1,sizeof head);cnt=0;
for(int i=1;i<=m;i++) if(col[xlis[i]]!=col[ylis[i]]) add(col[xlis[i]],col[ylis[i]]);
//搜3
for(int i=1;i<=cnum;i++){if(!dp[i]) dfs3(i);ans=max(ans,dp[i]);}
printf("%d",ans);
return 0;
}