50ptsP3387求调
  • 板块灌水区
  • 楼主AeeE5x
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/21 16:05
  • 上次更新2024/7/21 16:55:40
查看原帖
50ptsP3387求调
708516
AeeE5x楼主2024/7/21 16:05

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;
}
2024/7/21 16:05
加载中...