20分MLE加TLE求助
查看原帖
20分MLE加TLE求助
459935
mszyyds楼主2022/7/23 15:14
#include <bits/stdc++.h>
using namespace std;
int n,m,val[100005],dfn[100005],low[100005],stackk[100005],top,cnt;
int scc[100005],cnt_scc,st,en,b[100005],s[100005];
bool ins[100005];
vector<int> e[100005],E[100005];
void tarjan(int u,int last)
{
	dfn[u]=low[u]=++cnt;
	ins[u]=true;
	stackk[++top]=u;
	int v;
	for(int i=0;i<e[u].size();i++)
	{
		v=e[u][i];
//		if(u==3) cout<<i<<" "<<v<<endl;
		if(dfn[v])
		{
			if(ins[v])
			{
				low[u]=min(low[u],dfn[v]);
//				cout<<u<<" "<<v<<" m"<<endl;
			}
		}
		else
		{
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
		}
	}
	if(low[u]<=dfn[u]&&ins[u])
	{
		cnt_scc++;
//		cout<<cnt_scc<<endl;
		while(low[stackk[top]]<dfn[stackk[top]])
		{
			ins[stackk[top]]=false;
			scc[stackk[top]]=cnt_scc;
			if(stackk[top]==1) st=cnt_scc;
			if(stackk[top]==n) en=cnt_scc;
//			cout<<stackk[top]<<" ";
			top--;
		}
		ins[stackk[top]]=false;
		scc[stackk[top]]=cnt_scc;
		if(stackk[top]==1) st=cnt_scc;
		if(stackk[top]==n) en=cnt_scc;
//		cout<<stackk[top]<<endl;
		top--;
	}
}
void work(int u)
{
	int v;
	for(int i=0;i<e[u].size();i++)
	{
		v=e[u][i];
		if(scc[v]==scc[u]) continue;
		else E[scc[u]].push_back(scc[v]);
	}
}
int dfs(int u,int minb,int ans)
{
	minb=min(minb,b[u]);
	ans=max(ans,s[u]-minb);
//	cout<<u<<" "<<s[u]<<" "<<minb<<" "<<ans<<endl;
	int tmp;
	if(E[u].size()==0&&u!=en) return -1;
	for(int i=0;i<E[u].size();i++)
	{
		tmp=dfs(E[u][i],minb,ans);
		if(tmp!=-1) ans=max(ans,tmp);
	}
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>val[i];
	int x,y,z;
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y>>z;
		if(z==1) e[x].push_back(y);
		else
		{
			e[x].push_back(y);
			e[y].push_back(x);
		}
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,-1);
	for(int i=1;i<=n;i++) work(i);
	for(int i=1;i<=cnt_scc;i++) b[i]=101;
	for(int i=1;i<=n;i++)
	{
//		cout<<low[i]<<endl;		
		b[scc[i]]=min(b[scc[i]],val[i]);
		s[scc[i]]=max(s[scc[i]],val[i]);
	}
//	for(int i=1;i<=cnt_scc;i++) cout<<b[i]<<" "<<s[i]<<endl;
	cout<<dfs(st,10000000,0);
	return 0;
}

2022/7/23 15:14
加载中...