萌新刚学OI,求助网络流 3TLE 1WA
查看原帖
萌新刚学OI,求助网络流 3TLE 1WA
341373
Autofreeze楼主2021/2/23 10:50

RT,前三个点T飞,最后一个点没判出来 -1/kk

#include<bits/stdc++.h>
#define N 2001001
#define inf 1000000000
#define MAX 1101
using namespace std;
typedef int ll;
typedef double db;
const ll mod=1000000007;
inline void read(register ll &ret)
{
	scanf("%d",&ret);
	return;
}
ll n,m,g[N],cnt,head[N],w[N],tot,S,T,dep[N],now[N];
struct _edge
{
	ll from,to,l,r;
}ee[N];
struct edge
{
	ll from,to,nxt,dis;
}e[N];
inline void add(register ll u,register ll v,register ll d)
{
	e[++cnt].from=u;
	e[cnt].to=v;
	e[cnt].dis=d;
	e[cnt].nxt=head[u];
	head[u]=cnt;
	return;
}
queue<ll>q;
inline bool bfs(register ll s,register ll t)
{
	while(!q.empty())
		q.pop();
	memset(dep,0,(T+5)*sizeof(ll));
	q.push(s);
	dep[s]=1;
	while(!q.empty())
	{
		register ll ver=q.front();
		q.pop();
		now[ver]=head[ver];
		for(register int i=head[ver];i!=-1;i=e[i].nxt)
		{
			if(e[i].dis&&!dep[e[i].to])
			{
				dep[e[i].to]=dep[ver]+1;
				q.push(e[i].to);
			}
		}
	}
	return dep[t];
}
inline ll dfs(register ll s,register ll t,register ll ver,register ll lim)
{
	if(ver==t)
		return lim;
	register ll out=0;
	for(register ll &i=now[ver];i!=-1&&lim;i=e[i].nxt)
	{
		if(e[i].dis&&dep[e[i].to]==dep[ver]+1)
		{
			register ll tmp=dfs(s,t,e[i].to,min(lim,e[i].dis));
			e[i].dis-=tmp;
			e[i^1].dis+=tmp;
			lim-=tmp;
			out+=tmp;
		}
	}
	if(!out)
		dep[ver]=0;
	return out;
}
inline ll dinic(register ll s,register ll t)
{
	register ll ret=0;
	while(bfs(s,t))
		ret+=dfs(s,t,s,inf);
	return ret;
}
ll s,t;
inline ll solve()
{
	for(register int i=1;i<=tot;i++)
	{
		add(ee[i].from,ee[i].to,ee[i].r-ee[i].l);
		add(ee[i].to,ee[i].from,0);
		w[ee[i].from]-=ee[i].l;
		w[ee[i].to]+=ee[i].l;
	}
	register ll tmp=0;
	for(register int i=s;i<=t;i++)
	{
		if(w[i]<0)
		{
			add(i,T,-w[i]);
			add(T,i,0);
		}
		else if(w[i]>0)
		{
			add(S,i,w[i]);
			add(i,S,0);
			tmp+=w[i];
		}
	}
	if(dinic(S,T)!=tmp)
		return -1;
	return dinic(s,t);
}
signed main()
{
	while(scanf("%d",&n)!=-1)
	{
		tot=0;
		cnt=-1;
		memset(head,-1,sizeof(head));
		memset(w,0,sizeof(w));
		read(m);
		s=0,t=n+m+1;
		S=n+m+2,T=n+m+3;
		for(register int i=1;i<=m;i++)
		{
			read(g[i]);
			ee[++tot].from=i+n;
			ee[tot].to=t;
			ee[tot].l=g[i];
			ee[tot].r=inf;
		}
		ee[++tot].from=t;
		ee[tot].to=s;
		ee[tot].l=0;
		ee[tot].r=inf;
		for(register int i=1;i<=n;i++)
		{
			register ll c,d;
			read(c);
			read(d);
			ee[++tot].from=s;
			ee[tot].to=i;
			ee[tot].l=0;
			ee[tot].r=d;
			for(register int j=1;j<=c;j++)
			{
				register ll p,l,r;
				read(p);
				read(l);
				read(r);
				p++;
				ee[++tot].from=i;
				ee[tot].to=n+p;
				ee[tot].l=l;
				ee[tot].r=r;
			}
		}
		printf("%lld\n",solve());
		putchar('\n');
	}
	exit(0);
}
2021/2/23 10:50
加载中...