20pts其余全wa
查看原帖
20pts其余全wa
195349
未泯楼主2021/10/11 20:40
#include<bits/stdc++.h>
using namespace std;
#define N 100080
#define M 1000040
int n,m,a[M],b[M],s[N];//主程序
struct edge {
	int to,next;
} line[M];
int head[N],cnt=0;//建图
int dfn[N]= {0},low[N]= {0},nn=0,vis[N]= {0},countt=0,belong[N]= {0};
stack<int>S;
int minn[N],maxn[N]= {0};//tarjan
int in[N]= {0},deep[N]= {0};
inline int get(void) {
	int x=0;
	char ch=getchar();
	while(ch>'9' || ch<'0')ch=getchar();
	while(ch>='0' && ch<='9')(x*=10)+=ch-'0',ch=getchar();
	return x;
}
void add(int x,int y) {
	line[++cnt].to=y;
	line[cnt].next=head[x];
	head[x]=cnt;
}
void tarjan(int x) {
	dfn[x]=low[x]=++countt;
	S.push(x);
	vis[x]=1;
	for(int i=head[x]; i; i=line[i].next) {
		int to=line[i].to;
		if(!dfn[to]) {
			tarjan(to);
			low[x]=min(low[to],low[x]);
		} else if(vis[to]) {
			low[x]=min(low[x],dfn[to]);
		}
	}
	if(dfn[x]==low[x]) {
		nn++;
		int k=S.top();
		while(k!=x) {
			S.pop();
			belong[k]=nn;
			vis[k]=0;
			minn[nn]=min(minn[nn],s[k]);
			maxn[nn]=max(maxn[nn],s[k]);
			k=S.top();
		}
		vis[k]=0;
		S.pop(),belong[k]=nn;
		minn[nn]=min(minn[nn],s[k]);
		maxn[nn]=max(maxn[nn],s[k]);
	}
}
void clear() {
	cnt=0;
	for(int i=1; i<=n; i++)head[i]=0;
	for(int i=1; i<=2*m; i++)line[i].to=line[i].next=0;
}
void tuopo() {
	queue<int>Q;
	for(int i=1; i<=nn; i++) {
		if(!in[i])Q.push(i);
	}
	while(!Q.empty()) {
		int x=Q.front();
		Q.pop();
		for(int i=head[x]; i; i=line[i].next) {
			int to=line[i].to;
			deep[to]=min(deep[to],deep[x]);
			in[to]--;
			if(!in[to])Q.push(to);
		}
	}
}
int main() {
	freopen("P1073_2.in","r",stdin);
	n=get(),m=get();
	for(int i=1; i<=n; i++) {
		s[i]=get();
	}
	int c;
	int k=0;
	for(int i=1; i<=m; i++) {
		a[i]=get(),b[i]=get(),c=get();
		if(c==1)add(a[i],b[i]);
		else add(a[i],b[i]),add(b[i],a[i]),k++;
	}
	int mm=m+k;
	for(int i=1; i<=n; i++)minn[i]=900;
	for(int i=1; i<=n; i++) {
		if(!dfn[i])tarjan(i);
	}
	clear();
	for(int i=1; i<=mm; i++) {
		int from=a[i],to=b[i];
		if(belong[from]!=belong[to])add(belong[from],belong[to]),in[belong[to]]++;
	}
	for(int i=1; i<=nn; i++)deep[i]=minn[i];
	tuopo();
	int ans=0;
	for(int i=1; i<=nn; i++)ans=max(ans,maxn[i]-deep[i]);
	printf("%d",ans);
}
2021/10/11 20:40
加载中...