0pts求条
查看原帖
0pts求条
686431
gdxsbgx楼主2025/6/13 14:33
#include <bits/stdc++.h>
using namespace std;

const int N=1e6+10;

int in[N],out[N],g[N],d[N],now[N],tot,sum,n,m,s,t;
struct P{int v,w;}a[N];
vector<int> e[N];
queue<int> q;

void addedge(int u,int v,int w)
{
	tot++;
	a[tot]={v,w};
	e[u].push_back(tot);
	tot++;
	a[tot]={u,0};
	e[u].push_back(tot);
}

bool bfs()
{
	while(!q.empty()) q.pop();
	memset(d,0x3f,sizeof(d));
	d[s]=0;
	q.push(s);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int id:e[u])
		{
			int v=a[id].v,w=a[id].w;
			if(d[v]<d[0]||w==0) continue;
			d[v]=d[u]+1;
			q.push(v);
		}
	}
	return d[t]<d[0];
}

int dinic(int u,int flow)
{
	if(u==t||flow==0) return flow;
	int sum=flow;
	for(int i=0;i<e[u].size();i++)
	{
		int v=a[e[u][i]].v,w=a[e[u][i]].w;
		if(d[v]!=d[u]+1||w==0) continue;
		int val=dinic(v,min(sum,w));
		if(val==0) d[v]=0;
		a[e[u][i]].w-=val;
		a[e[u][i]^1].w+=val;
		sum-=val;
		if(sum==0) break; 
	}
	return flow-sum;
}

int main()
{
	while(scanf("%d %d",&n,&m))
	{
		int s1=n+m+1,t1=n+m+2,s2=n+m+3,t2=n+m+4;
		s=s2,t=t2;
		sum=0,tot=1;
		memset(in,0,sizeof(in));
		memset(out,0,sizeof(out));
		memset(now,0,sizeof(now));
		for(int i=1;i<=m;i++)
		{
			scanf("%d",&g[i]);
			in[t1]+=g[i];
			out[n+i]+=g[i];
			addedge(n+i,t1,2e9);
		}
		for(int i=1;i<=n;i++)
		{
			int x,y;
			scanf("%d %d",&x,&y);
			addedge(s1,i,y);
			for(int j=1;j<=x;j++)
			{
				int pos,l,r;
				cin >> pos >> l >> r;
				pos++;
				in[n+pos]+=l,out[i]+=l;
				addedge(i,n+pos,r-l);
			}
		}
		for(int i=1;i<=n+m+2;i++)
		{
			if(in[i]>out[i])
			{
				addedge(s,i,in[i]-out[i]);
				sum+=in[i]-out[i];
			}
			else addedge(i,t,out[i]-in[i]);
		}
		addedge(t1,s1,2e9);
		int Dinic=0;
		while(bfs())
		{
			while(true)
			{
				int tmp=dinic(s,2e9);
				Dinic+=tmp;
				if(tmp==0) break;
			}
		}
		if(Dinic!=sum)
		{
			printf("-1\n\n");
			continue;
		}
		int sm=a[tot].w;
		a[tot].w=a[tot^1].w=0;
		s=s1,t=t1;
		while(bfs())
		{
			while(true)
			{
				int tmp=dinic(s,2e9);
				sm+=tmp;
				if(tmp==0) break;
			}
		}
		printf("%d\n\n",sm);
	}
	return 0;
}
```cpp
2025/6/13 14:33
加载中...