hack全过,其他全错
查看原帖
hack全过,其他全错
1065103
Atri_Lobato楼主2024/10/4 20:12
#include<iostream>
#include<cstdio>
using namespace std;
struct Edge
{
	int nxt,to;
}edge[2000005];
int head[100005];
int head2[100005];
int price[100005];
int m,n;
int n2=0;
int tot=0;
void add(int from,int to)
{
	tot++;
	edge[tot].to=to;
	edge[tot].nxt=head[from];
	head[from]=tot;
}
void add2(int from,int to)
{
	tot++;
	edge[tot].to=to;
	edge[tot].nxt=head2[from];
	head2[from]=tot;
}
int dfn[100005];
int low[100005];
int Stack[100005];
int color[100005];
int co=0;
int top=0;
int order=0;
int in[100005];
int maxc[100005];
int minc[100005];
void Tarjan(int now)
{
	in[now]=1;
	order++;
	top++;
	Stack[top]=now;
	dfn[now]=order;
	low[now]=order;
	for(int i=head[now];i;i=edge[i].nxt)
	{
		int np=edge[i].to;
		if(dfn[np]==0)
		{
			Tarjan(np);
			low[now]=min(low[now],low[np]);
		}
		else if(in[np]==1)
		{
			low[now]=min(low[now],dfn[np]);
		}
	}
	if(low[now]>=dfn[now])
	{
		co++;
		maxc[co]=price[now];
		minc[co]=price[now];
		while(Stack[top]!=now)
		{
			maxc[co]=max(maxc[co],price[Stack[top]]);
			minc[co]=min(minc[co],price[Stack[top]]);
			color[Stack[top]]=co;
			in[Stack[top]]=0;
			if(Stack[top]==n)
			{
				n2=co;
			}
			top--;
		}
		if(Stack[top]==n)
		{
			n2=co;
		}
		color[Stack[top]]=co;
		in[Stack[top]]=0;
		top--;
	}
}
void rebuild()
{
	for(int i=1;i<=n;i++)
	{
		for(int q=head[i];q;q=edge[q].nxt)
		{
			int to=edge[q].to;
			if(color[to]!=color[i])
			{
				add2(color[i],color[to]);
			}
		}
	}
}
int eff[100005];
int vis[100005];
int dpmax[100005];
int dpmin[100005];
struct DP
{
	int maxn,minn,ef;
}dp;
DP dfs(int now)
{
	DP tmp;
	if(vis[now])
	{
		tmp.maxn=dpmax[now];
		tmp.minn=dpmin[now];
		tmp.ef=eff[now];
		return tmp;
	}
	vis[now]=1;
	dpmax[now]=maxc[now];
	dpmin[now]=minc[now];
	if(now==n2)
	eff[now]=1;
	for(int i=head2[now];i;i=edge[i].nxt)
	{
		int np=edge[i].to;
		DP t=dfs(np);
		if(t.ef==1)
		{
			dpmax[now]=max(dpmax[now],t.maxn);
			dpmin[now]=min(dpmin[now],t.minn);
			eff[now]=1;
		}
	}
	tmp.maxn=dpmax[now];
	tmp.minn=dpmin[now];
	tmp.ef=eff[now];
	return tmp;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&price[i]);
	}
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		add(a,b);
		if(c==2)
		{
			add(b,a);
		}
	}
	Tarjan(1);
	rebuild();
	eff[n2]=1;
	for(int i=1;i<=co;i++)
	{
		if(vis[i]==0)
		{
			dfs(i);
		}
	}
	int ans=0;

	for(int i=1;i<=co;i++)
	{
		if(eff[i])
		{
			ans=max(ans,dpmax[i]-dpmin[i]);
		}
	}
	cout<<ans;
	return 0;
}
//	for(int i=1;i<=n;i++)
//	{
//		cout<<color[i]<<' ';
//	}
//	cout<<endl;
//	for(int i=1;i<=co;i++)
//	{
//		cout<<i<<":\n";
//		for(int q=head2[i];q;q=edge[q].nxt)
//		{
//			cout<<edge[q].to<<' ';
//		}
//		cout<<"\n";
//	}
//	cout<<endl;
//	for(int i=1;i<=co;i++)
//	{
//		cout<<maxc[i]<<' '<<minc[i]<<endl;
//	}cout<<endl;
//	for(int i=1;i<=co;i++)
//	{
//		cout<<dpmax[i]<<' '<<dpmin[i]<<endl;
//	}
2024/10/4 20:12
加载中...