T5WA求调 tajan+dfs
查看原帖
T5WA求调 tajan+dfs
780255
HardWhite楼主2024/10/11 21:14
#include<bits/stdc++.h>

using namespace std;

const int N=1e6+100;

int from[N],nt[N],to[N];
int n,m,ans=-1;

struct val{
	int maxf;
	int minf;
}v[N];

void addedge(int x,int y,int i){
	to[i]=y;
	nt[i]=from[x];
	from[x]=i;
	return;
}

int def[N],low[N];

void tajan(int x){
	int i=from[x],xi;
	while(to[i]){
		xi=to[i];
		if(def[xi]==0) {
			def[xi]=def[x]+1;
			low[xi]=def[xi];
			tajan(xi);
			if(low[xi]<low[x]) low[x]=low[xi];
		}
		else{
			if(low[xi]<low[x]){
				low[x]=low[xi];
				if(v[xi].maxf>v[x].maxf) 
					v[x].maxf=v[xi].maxf;
				else v[xi].maxf=v[x].maxf;
				if(v[xi].minf<v[x].minf)
					v[x].minf=v[xi].minf;
				else v[xi].minf=v[x].minf;
			}
		}
		i=nt[i];
	}
	return;
}

bool f[N];
void searchm(int maxm,int minf,int crr){
	if(crr==n) ans=max(ans, maxm);
	f[crr]=1;
	if(v[crr].minf<minf) 
		minf=v[crr].minf;
	if(v[crr].maxf-minf>maxm)
		maxm=v[crr].maxf-minf;
	int i=from[crr];
	while(to[i]){
		if(!f[to[i]]){
			searchm(maxm,minf,to[i]);
		}
		i=nt[i];
	}
	f[N]=0;
	return;
}

int main(){ 
	cin>>n>>m; 
	for(int i=1;i<=n;i++){ 
		cin>>v[i].maxf; 
		v[i].minf=v[i].maxf;
	} 
	int x,y,z; 
	int ni=1,temp;
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		addedge(x,y,ni);
		temp=v[y].maxf-v[x].minf;
	    if(n<=2)	ans=max(ans,temp);
		ni++;
		if(z==2){
			addedge(y,x,ni);
			ni++;
		}
		
	} 
	tajan(1);
	searchm(0,110,1);
	cout<<ans;
	return 0;
}
2024/10/11 21:14
加载中...