求哪位大佬帮我看看为什么会TLE
查看原帖
求哪位大佬帮我看看为什么会TLE
397458
cbjbckmvkc楼主2024/3/9 14:22
#include<bits/stdc++.h>
using namespace std;
const int N=2e4;
int n,m,a[N];
int he[N],ne[N],u[2*N],e[2*N],cnt,ooo;
int dfn[N],low[N],sd[N],ti;
int vis[N],stck[N],top,in[N],dis[N];
void add(int x,int y){
	ne[++cnt]=he[x];
	he[x]=cnt;
	e[cnt]=y;
	u[cnt]=x;
}
void tarjan(int x){
	ooo++;
	dfn[x]=low[x]=++ti;
	vis[x]=1,stck[++top]=x;
	for(int i=he[x];i;i=ne[i]){
		if(!dfn[e[i]]){
			tarjan(e[i]);
			low[x]=min(low[e[i]],low[x]);
		}
		else if(vis[e[i]]){
			low[x]=min(low[e[i]],low[x]);
		}
	}
	if(dfn[x]==low[x]){
		int y;
		while(y=stck[top--]){
			vis[y]=0;
			sd[y]=x;
			if(x==y) break;
			a[x]+=a[y];
		}
	}
}
int topo(){
	queue<int> p;
	for(int i=1;i<=n;i++){
		if(i==sd[i]&&!in[i]){
			dis[i]=a[i];
			p.push(i);
		}
	}
	while(!p.empty()){
		int now=p.front();
		p.pop();
		for(int i=he[now];i;i=ne[i]){
			dis[e[i]]=max(dis[e[i]],dis[now]+a[e[i]]);
			in[e[i]]--;
			if(!in[e[i]]) p.push(e[i]);
		}
	}
	int ans=-1e7;
	for(int i=1;i<=n;i++) ans=max(ans,dis[i]);
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=m;i++){
		int l,r;
		scanf("%d%d",&l,&r);
		add(l,r);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
	cnt=0;
	memset(he,0,sizeof he);
	for(int i=1;i<=m;i++){
		int x=sd[u[i]],y=sd[e[i]];
		if(x!=y){
			ne[++cnt]=he[x];
			he[x]=cnt;
			e[cnt]=y,u[cnt]=x;
			in[y]++;
		}
	}
	printf("%d",topo());
	return 0;
}
2024/3/9 14:22
加载中...