可爱萌新刚学OI,Tarjan在线求调
查看原帖
可爱萌新刚学OI,Tarjan在线求调
1002529
Fp0cY1tZ6Nn4Rd_楼主2024/7/20 13:22
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
const int N=1e4+5,M=1e5+5;
int a[N],scc[N],val[N],dfn[N],low[N],d[N],dist[N],n,m,u,v,cnt,tot,ans;
bool vis[N];
vector<int> G[N],H[N];
stack<int> st;
queue<int> q;
void tarjan(int idx){
	dfn[idx]=low[idx]=++cnt;
	st.push(idx);
	vis[idx]=true;
	for(int nxt=0;nxt<G[idx].size();nxt++){
		if(!dfn[nxt]){
			tarjan(nxt);
			low[idx]=min(low[idx],low[nxt]);
		}else if(vis[nxt]){
			low[idx]=min(low[idx],dfn[nxt]);
		}
	}
	if(dfn[idx]==low[idx]){
        ++tot;
        while(st.top()!=idx){
	    	vis[st.top()]=false;
	    	scc[st.top()]=tot;
	    	val[tot]+=a[st.top()];
	    	st.pop();
	    }
		vis[st.top()]=false;
		scc[st.top()]=tot;
		val[tot]+=a[st.top()];
		st.pop();
    }
}
void toposort(){
	for(int i=1;i<=n;i++){
		if(!d[i]){
			q.push(i);
			dist[i]=a[i];
		}
	}
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=0;i<G[x].size();i++){
			dist[G[x][i]]=max(dist[G[x][i]],dist[x]+a[dist[G[x][i]]]);
			d[G[x][i]]--;
			if(!d[G[x][i]])
				q.push(G[x][i]);
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		G[u].push_back(v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i])
			tarjan(i);
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<G[i].size();j++){
			int x=scc[i],y=scc[G[i][j]];
			if(x!=y){
				H[x].push_back(y);
				d[y]++;
			}
		}
	}
	toposort();
	for(int i=1;i<=n;i++)
		ans=max(ans,dist[i]);
	cout<<ans<<endl;
	return 0;
}
2024/7/20 13:22
加载中...