10pts求调
查看原帖
10pts求调
808180
HDS_Acenaphthylene楼主2023/6/7 22:01
#include<bits/stdc++.h>
#define N 500005 
#define TOR (1<<30)
using namespace std;
int D[N],F[N]/*SCC最大*/,M[N]/*SCC最小*/;
int ans[N];
int dfn[N],low[N],in_stack[N],dfncnt;
int scc[N],sc,sz[N];
stack<int> s;
struct gra{
	vector<int> E[N],V[N];
	int R[N],C[N],n,m;
	int vis[N];
	void add_edge(int s,int e,int v){
		E[s].push_back(e);
		C[s]++;
		R[e]++;
		V[s].push_back(v); 
	}
}ma,wma;
void dfs(int u){
	low[u] = dfn[u] = ++dfncnt,in_stack[u] = 1;
	s.push(u);
	for (int i=0; i<ma.E[u].size();i++){
    	const int &v = ma.E[u][i];
    	if (!dfn[v]) {
      		dfs(v);
      		low[u] = min(low[u], low[v]);
  		} else if (in_stack[v]) {
  	    	low[u] = min(low[u], dfn[v]);
  	  	}
  	}
	if (dfn[u] == low[u]) {
		++sc;
		while (s.top() != u) {
			scc[s.top()] = sc;
			sz[sc]++;
			in_stack[s.top()] = 0;
			s.pop();
    	}
    	scc[s.top()] = sc;
    	sz[sc]++;
    	in_stack[s.top()] = 0;
    	s.pop();
  	}
}
int Dfsmax(int u){
	int tans=F[u];
	for (int j=0; j<wma.E[u].size();j++){
    	tans=max(Dfsmax(wma.E[u][j]),tans);
	}
	ans[u]=tans-M[u];
	return tans;
}
int main(){
	for(int i=1;i<=N;i++){
		F[i]=-1,M[i]=1000000000;
	}
	scanf("%d%d",&ma.n,&ma.m);
	for(int i=1;i<=ma.n;i++){
		scanf("%d",&D[i]);
	}
	for(int i=1;i<=ma.m;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		ma.add_edge(x,y,1);
		if(z>1)	{
			ma.add_edge(y,x,1);;
		}
	}
	for(int i=1;i<=ma.n;i++){
		if(scc[i]==0){
			dfs(i);
		}
	}
	wma.n=sc;
	for(int i=1;i<=ma.n;i++){
		for (int j=0; j<ma.E[i].size();j++){
    		wma.add_edge(scc[i],ma.E[i][j],1);
    		F[scc[i]]=max(F[scc[i]],D[i]);
    		M[scc[i]]=min(M[scc[i]],D[i]);
		}
	}
	Dfsmax(1);
	int t=0;
	for(int i=1;i<=wma.n;i++){
		t=max(t,ans[i]);
	}
	printf("%d",t);
	return 0;
}
2023/6/7 22:01
加载中...