subtaskTLE求救
查看原帖
subtaskTLE求救
1279251
frank7楼主2025/7/2 13:14

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m,a[N/10],hd[N/10],nxt[N],tot,dfn[N],low[N],tme,vis[N],scc_cnt,scc_id[N],scc_sum[N],ans,vis2[N];
stack<int>stk;
vector<int>e2[N];
struct nd{
	int u,v;
}e[N];
void add(int u,int v){
	e[tot].v=v;
	e[tot].u=u;
	nxt[tot]=hd[u];
	hd[u]=tot++;
}
void tarjan(int u){
	low[u]=dfn[u]=++tme;
	vis2[u]=1;
	stk.push(u);vis[u]=1;
	for(int i=hd[u];~i;i=nxt[i]){
		int v=e[i].v;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
	    else if(vis[v]){
	    	low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		int v;scc_cnt++;
		do{
			v=stk.top();stk.pop();
			vis[v]=0;
			scc_id[v]=scc_cnt;
			scc_sum[scc_cnt]+=a[v];
		}while(u!=v);
	}
}
void dfs(int u,int step,int fa){
	step+=scc_sum[u];
	if(e2[u].size()==0){
		ans=max(ans,step);
		return;
	}
	for(auto v:e2[u]){
		if(v==fa) continue;
		dfs(v,step,u);
	} 
	
}
int main(){
	cin>>n>>m;
	memset(hd,-1,sizeof hd);
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++){
		int u,v;cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++){
		if(!vis2[i])tarjan(i);
	}
	for(int i=1;i<=m;i++){
		if(scc_id[e[i].u]!=scc_id[e[i].v]){
			e2[scc_id[e[i].u]].push_back(scc_id[e[i].v]);
		}
	}
	for(int i=1;i<=scc_cnt;i++){
		dfs(i,0,0);
	}
	cout<<ans;
	return 0;
}
2025/7/2 13:14
加载中...