缩点板子50pts玄关求调
查看原帖
缩点板子50pts玄关求调
397250
CD_Sun_doer楼主2024/11/12 10:10

rt

#include<bits/stdc++.h>
#define int long long
#define Up(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int N=1e6+10,M=1e6+10;
int n,m;
vector<int> e1[M],e2[M];
int a[N],dfn[N],low[N],vis[N],col[N],dis[N],cnt,idx,ans;
stack<int> st;
queue<int> q;
struct edge{
	int u,v;
}ee[M];
void tarjin(int u){
	dfn[u]=low[u]=++idx;
	st.push(u);
	vis[u]=1;
	for(auto v:e1[u]){
		if(dfn[v]){
			low[u]=min(low[u],dfn[v]);
		}else{
			tarjin(v);
			low[u]=min(low[u],low[v]);
		}
	}
	if(dfn[u]==low[u]){
		int v;
		while(v=st.top()){
			st.pop();
			vis[v]=0,col[v]=u;
			if(u==v) break;
			a[u]+=a[v];
		}
	}
}
bool vv[N];
int ru[N];
signed main(){
	cin.tie(0),cout.tie(0)->sync_with_stdio(0);
	cin>>n>>m;
	Up(i,1,n) cin>>a[i];
	Up(i,1,m){
		int u,v;
		cin>>u>>v;
		e1[u].push_back(v);
		ee[i]={u,v};
	}
	Up(i,1,n) if(!dfn[i]) tarjin(i);
	Up(i,1,m){
		int u=ee[i].u,v=ee[i].v;
		//cout<<u<<" "<<v<<" "<<col[u]<<" "<<col[v]<<"$$$\n";
		if(col[u]!=col[v]){
			e2[col[u]].push_back(col[v]);
			ru[col[v]]++;
		}
	}
	Up(i,1,n){
		if(col[i]==i&&ru[i]==0) q.push(i),dis[i]=a[i];
	}
	while(!q.empty()){
		int u=q.front();q.pop();
		for(auto v:e2[u]){
			dis[v]=max(dis[v],dis[u]+a[v]);
			ru[v]--;
			if(ru[v]==0) q.push(v);
		}
	}
	Up(i,1,n) ans=max(ans,dis[i]);
	cout<<ans<<"\n";
	return 0;
}
2024/11/12 10:10
加载中...