我要调吐了,跪求大佬帮一下忙
查看原帖
我要调吐了,跪求大佬帮一下忙
317568
AuKr楼主2020/11/5 10:51

思路是缩点+拓扑排序,然而只对了一个点,想求大佬们帮下忙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;
} 
2020/11/5 10:51
加载中...