为什么把1e18改成1e15才能过????
查看原帖
为什么把1e18改成1e15才能过????
354820
boss11楼主2021/3/19 16:33
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct nb{
	ll n,v,w,q;
}ed[1000001];
ll pop=1,n,m,s,t,head[100001],dis[100001],vis[100001];
void add(ll a,ll b,ll c,ll d)
{
	ed[++pop]=nb{head[a],b,c,d};head[a]=pop;
	ed[++pop]=nb{head[b],a,0,-d};head[b]=pop;
}
queue<ll>q;
ll fff[100001],pre[100001];
ll SPEA()
{
	memset(vis,0,sizeof(vis));
	for(ll i=1;i<=n+2;i++)dis[i]=1e18;
	dis[s]=0;q.push(s);fff[s]=1e18;
	while(!q.empty())
	{
		ll u=q.front();q.pop();
		vis[u]=0;
		for(ll i=head[u];i;i=ed[i].n)
		{
			ll v=ed[i].v;
			if(ed[i].w&&dis[v]>dis[u]+ed[i].q)
			{
				dis[v]=ed[i].q+dis[u];
				pre[v]=i;fff[v]=min(ed[i].w,fff[u]);
				if(!vis[v])
				{
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}return dis[t]!=1e18;
}ll ans;
void dfs()
{
	ll x=t;
	while(x!=s)
	{
		ll i=pre[x];
		ed[i].w-=fff[t];
		ed[i^1].w+=fff[t];
		x=ed[i^1].v;
	}
	ans+=dis[t]*fff[t];
}ll a[100001],b[100001];
int main()
{
	cin>>n>>m;
	s=0,t=n+2;
	add(s,1,1e18,0);add(n+1,t,1e18,0);
	for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
	//printf("%lld",a[i]);
	for(ll i=1;i<=n;i++)add(i,i+1,1e18-a[i],0);
	for(ll i=1,g,h,j;i<=m;i++)
	scanf("%lld%lld%lld",&g,&h,&j),add(g,h+1,1e18,j);
	while(SPEA())
		dfs();
	cout<<ans;
}
2021/3/19 16:33
加载中...