大佬帮帮蒟蒻!!!!
查看原帖
大佬帮帮蒟蒻!!!!
92532
微笑的坏坏楼主2021/5/4 14:11

10分,吐了(我相信看了我的代码的人会感到ex的) tarjan+spfa

救救孩子!

#include<bits/stdc++.h>
using namespace std;
int cnt,head[10000005],hhead[1000005],cntt;
int dfn[1000005],low[10000005],id[1000005],t,l,ld,sum[1000005],usum[1000005];
int n,m,x,y,z,a[1000005];
int beg,fin,sss[10000005],ssb[1000005];
bool f[1000005],fs[1000005];
stack<int> s;
queue<int> q;
struct edge
{
	int next,to;
}e[1000005],ee[10000005];
int read()
{
    int w=1,q=0;char ch=' ';
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch>='0'&&ch<='9')q=q*10+ch-'0',ch=getchar();
    return w*q;
}
void add(int x,int y)
{
	cnt++;
	e[cnt].next=head[x];
	e[cnt].to=y;
	head[x]=cnt;
}
void addd(int x,int y)
{
	cntt++;
	ee[cntt].next=hhead[x];
	ee[cntt].to=y;
	hhead[x]=cntt;
}
void tarjan(int u)
{
	dfn[u]=low[u]=++t;
	s.push(u);
	f[u]=1;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].to;
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(f[v])
			low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		l++;
		usum[l]=1e9;
		while(f[u])
		{
			id[s.top()]=l;
			sum[l]=max(sum[l],a[s.top()]);
			usum[l]=min(usum[l],a[s.top()]);
			f[s.top()]=0;
			s.pop();
		}
	}
	return;
}
void spfa()
{
	q.push(beg);
	fs[beg]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=ee[i].next)
		{
			int v=ee[i].to;
			sss[v]=max(sss[v],sss[u]);
			ssb[v]=min(ssb[v],ssb[u]);
			if(!f[v]) q.push(v);
			f[v]=1;
		}
	}
	return;
}
int main()
{
	n=read();
	m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++)
	{
		x=read();
		y=read();
		z=read();
		add(x,y);
		if(z==2) add(y,x);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
			tarjan(i);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=head[i];j;j=e[j].next)
		{
			if(id[i]==id[e[j].to]) continue;
			addd(id[i],id[e[j].to]);
		}
	}
	beg=id[1];
	fin=id[n];
	if(beg==fin)
	{
		cout<<sum[id[1]]-a[1]<<endl;
		return 0;
	}
	for(int i=1;i<=l;i++) sss[i]=sum[i],ssb[i]=usum[i];
	spfa();
	cout<<max(sss[fin]-ssb[fin],0)<<endl;
	return 0;
}
2021/5/4 14:11
加载中...