40分求助QAQ!!!QAQ!!!
查看原帖
40分求助QAQ!!!QAQ!!!
229381
小小飞龙楼主2021/5/28 21:20
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int h[maxn],w[maxn],nex[maxn],e[maxn],idx;
int vh[maxn],vw[maxn],vnex[maxn],ve[maxn],vidx;
int n,m,sz[maxn],in[maxn];
int dfn[maxn],low[maxn],top,val[maxn];
int instk[maxn],stk[maxn],id[maxn],cnt,timestep;
queue<int>q;

void add(int x,int y){
	e[++idx]=y;
	nex[idx]=h[x];
	h[x]=idx;
}

void vadd(int x,int y){
	ve[++vidx]=y;
	vnex[vidx]=vh[x];
	vh[x]=vidx;
}


void tarjan(int u){
	dfn[u]=low[u]=++timestep;
	stk[++top]=u;
	instk[u]=1;
	for(int i=h[u];i;i=nex[i]){
		int j=e[i];
		if(!dfn[j]){
			
			tarjan(j);
			low[u]=min(low[u],low[j]);
		}
		else if(instk[j])low[u]=min(low[u],dfn[j]);
	}
	
	if(low[u]==dfn[u]){
		++cnt;
		int y;
		do{
			y=stk[top--];
			instk[y]=0;
			id[y]=cnt;
			sz[cnt]+=val[y];
		}while(y!=u);
		//sz[cnt]+=val[u];
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>val[i];
	}
	int x,y;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		add(x,y);
	}
	
	for(int i=1;i<=n;i++)
	if(!dfn[i])tarjan(i);
	
	for(int i=1;i<=n;i++){
		for(int j=h[i];j;j=nex[j]){
			int k=e[j];
			if(id[k]!=id[i]){
				vadd(id[i],id[k]);
				in[k]++;
			}
		}
	}
	
	int ans=0;
	for(int i=1;i<=cnt;i++){
		w[i]=sz[i];
		if(in[i]==0)q.push(i),ans=max(ans,w[i]);
		}
		
	while(q.size()){
		int top=q.front();
		q.pop();
		for(int i=vh[top];i;i=vnex[i]){
			int j=ve[i];
			w[j]=max(w[j],sz[j]+w[top]);
			ans=max(ans,w[j]);
			in[j]--;
			if(in[j]==0)q.push(j);
		}
	}
	
	
	cout<<ans<<endl;
} 
2021/5/28 21:20
加载中...