求助 tj+拓扑wa了
查看原帖
求助 tj+拓扑wa了
185935
lavd楼主2020/11/4 21:48

过了第一个点...

#include<iostream>
#include<cmath>
#include<cstring> 
#include<algorithm>
using namespace std;
long long n,m,dfn[100005],low[100005],head1[100005],va[100005],belong[100005];
bool vis[100005];
long long tot1,tot2,sum,cnt,top,last,q[100005],head2[100005],ma[100005],mi[100005],ans[100005],in[100005];
struct node1{
	long long from,next,to;
}t1[1000005];
struct node2{
	long long next,to;
}t2[1000005];
void add1(long long x,long long y){
	tot1++;
	t1[tot1].next=head1[x];
	head1[x]=tot1;
	t1[tot1].from=x;
	t1[tot1].to=y;
}
void add2(long long x,long long y){
	tot2++;
	t2[tot2].next=head2[x];
	head2[x]=tot2;
	t2[tot2].to=y;
}
void tj(long long u){
	low[u]=dfn[u]=++sum;
	q[++top]=u;vis[u]=true;
	for(long long i=head1[u];i!=0;i=t1[i].next){
		long long v=t1[i].to;
		if(dfn[v]==0){
			tj(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		cnt++;
		long long x;
		do{
			x=q[top];top--;
			belong[x]=cnt;vis[x]=false;
			ma[cnt]=max(ma[cnt],va[x]);
			mi[cnt]=min(mi[cnt],va[x]);
		}while(x!=u);
		ans[cnt]=ma[cnt]-mi[cnt];
	}
}
void topo(){
	memset(q,0,sizeof(q));top=0;last=1;
	for(long long i=1;i<=cnt;i++){
		if(in[i]==0)q[++top]=i;
	}
	while(last<=top){
		long long u=q[last];
		last++;ans[u]=ma[u]-mi[u];
		for(long long i=head2[u];i!=0;i=t2[i].next){
			long long v=t2[i].to;
			mi[v]=min(mi[v],mi[u]);
			in[v]--;
			if(in[v]==0)q[++top]=v;
		}
	}
}
int main(){
	cin>>n>>m;
	memset(mi,1,sizeof(mi));
	memset(low,1,sizeof(low));
	for(long long i=1;i<=n;i++)cin>>va[i];
	long long x,y,z;
	for(long long i=1;i<=m;i++){
		cin>>x>>y>>z;
		add1(x,y);
		if(z==2)add1(y,x);
	}
	for(long long i=1;i<=n;i++)if(dfn[i]==0)tj(i);
	for(long long i=1;i<=tot1;i++){
		x=t1[i].from;y=t1[i].to;
		if(belong[x]!=belong[y]){
			add2(belong[x],belong[y]);
			in[belong[y]]++;
		}
	}
	topo();
	cout<<ans[belong[n]];
	return 0;
}
2020/11/4 21:48
加载中...