思路是缩点+拓扑排序,然而只对了一个点,想求大佬们帮下忙QWQ
#include"iostream"
#include"cstdio"
#include"cmath"
#include"cstring"
#include"queue"
using namespace std;
#define read(x) scanf("%d",&x)
#define N 100005
#define M 500005
int n,m;
int u[M],v[M],z;
struct node
{
int to,nxt;
}e[M<<1];
int head[N],cnt=0;
int low[N],num[N];
int be[N],mu[N];
int idx=0,tot=0;
int val[N],maxn[N],minx[N];
int st[N],top=0;
int in[N];
queue<int>q;
int ans=0;
void add(int u,int v){e[++cnt].to=v,e[cnt].nxt=head[u],head[u]=cnt;}
void dfs(int cur)
{
low[cur]=num[cur]=++idx;
st[++top]=cur;
for(int i=head[cur];i;i=e[i].nxt)
{
int j=e[i].to;
if(!low[j]) dfs(j);
if(!be[j]) low[cur]=min(low[cur],low[j]);
}
if(low[cur]==num[cur])
{
tot++;
while(1)
{
int u=st[top--];
be[u]=tot,maxn[tot]=max(maxn[tot],val[u]);
minx[tot]=min(minx[tot],val[u]);
if(u==cur) break;
}
}
return;
}
int main()
{
read(n),read(m);
for(int i=1;i<=n;i++) read(val[i]),maxn[i]=0,minx[i]=0x7fffffff;
for(int i=1;i<=m;i++)
{
read(u[i]),read(v[i]),read(z);
if(z==1) add(u[i],v[i]);
else add(u[i],v[i]),add(v[i],u[i]);
}
for(int i=1;i<=n;i++) if(!low[i]) dfs(i);
memset(head,0,sizeof(head));
//
memset(e,0,sizeof(e)),cnt=0;
//
for(int i=1;i<=m;i++)
{
if(be[u[i]]!=be[v[i]]) add(be[u[i]],be[v[i]]),in[v[i]]++;
}
for(int i=1;i<=tot;i++) if(!in[i]) q.push(i);
while(!q.empty())
{
int up=q.front();
q.pop();
ans=max(ans,maxn[up]-minx[up]);
for(int i=head[up];i;i=e[i].nxt)
{
int j=e[i].to;
minx[j]=min(minx[j],minx[up]);
in[j]--;
if(!in[j]) q.push(j);
}
}
printf("%d\n",ans);
return 0;
}