缩点+dp 70 pts 求调
查看原帖
缩点+dp 70 pts 求调
464001
5793__qwq楼主2022/12/23 18:21
#include<bits/stdc++.h>
#define N 100001
using namespace std;
int cost[N],d[N],fa[N],vis[N],mx[N>>2],nmx[N>>2],mn[N>>2],xb,s,n,m,x,y,z,t,k,cnt,of[N],ss;
stack<int> st;
vector<int> e[N];
set<int> ne[N];
queue<int> q;
inline void dfs(int x){
    if(!vis[x])
        st.push(x);
	d[x]=fa[x]=++s;
	vis[x]=1;
	for(int i=0;i<e[x].size();++i){
		int y=e[x][i];
		if(!d[y]){
			dfs(y);
			fa[x]=min(fa[x],fa[y]);
		}else
		if(vis[y])
			fa[x]=min(fa[x],d[y]);
	}
	if(fa[x]==d[x]){
		of[0]++;
		while(st.top()!=x){
			vis[st.top()]=0,of[st.top()]=of[0];
			st.pop();
		}
		vis[x]=0,of[x]=of[0];
		st.pop();
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		cin>>cost[i];
	for(int i=1;i<=m;++i){
		cin>>x>>y>>z;
		e[x].push_back(y);
		if(z==2)
			e[y].push_back(x);
	}
	for(int i=1;i<=n;++i)
		if(!d[i])
			dfs(i);
	for(int i=1;i<=n;++i){
		for(int j=0;j<e[i].size();++j){
			if(of[i]!=of[e[i][j]])
				ne[of[i]].insert(of[e[i][j]]);
		}
	}
    memset(mn,1,sizeof(mn));
	for(int i=1;i<=n;++i){
		nmx[of[i]]=max(nmx[of[i]],cost[i]);
		mn[of[i]]=min(mn[of[i]],cost[i]);
	}
	for(int i=1;i<=of[0];++i)
		mx[i]=nmx[i]-mn[i];
	
	q.push(of[1]); 
	while(!q.empty()){
		k=q.front();
		q.pop();
		for(set<int>::iterator it=ne[k].begin();it!=ne[k].end();it++){
            mn[*it]=min(mn[*it],mn[k]);
			mx[*it]=max(max(mx[k],mx[*it]),nmx[*it]-mn[*it]);
			q.push(*it);
        }
		/*for(int i=0;i<ne[k].size();++i){
			mn[ne[k][i]]=min(mn[ne[k][i]],mn[k]);
			mx[ne[k][i]]=max(max(mx[k],mx[ne[k][i]]),nmx[ne[k][i]]-mn[ne[k][i]]);
			q.push(ne[k][i]);
		}*/
	}	
	cout<<mx[of[n]];
	return 0;
}

MLE #4,5,6

2022/12/23 18:21
加载中...