全T求调,loj模板题已过
查看原帖
全T求调,loj模板题已过
848964
hzoi_Shadow楼主2025/2/6 19:51
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
const int inf=0x3f3f3f3f;
struct UpDownMaxFlow
{
	struct node
	{
		int nxt,to,cap,flow;
	}e[800010];
	int head[1510],f[1510],cur[1510],dis[1510],vis[1510],cnt=1,val,limit;
	void clear()
	{
		memset(e,0,sizeof(e));
		memset(head,0,sizeof(head));
		memset(f,0,sizeof(f));
		cnt=1;
	}
	void add(int u,int v,int w)
	{
		cnt++;  e[cnt]=(node){head[u],v,w,0};  head[u]=cnt;
		cnt++;  e[cnt]=(node){head[v],u,0,0};  head[v]=cnt;
	}
	void _add(int u,int v,int up,int down)
	{
		add(u,v,up-down);
		f[u]-=down;  f[v]+=down;
	}
	bool bfs(int s,int t)
	{
		memset(vis,0,sizeof(vis));
		queue<int>q;
		dis[s]=1;
		q.push(s);  vis[s]=1;
		while(q.empty()==0)
		{
			int x=q.front();  q.pop();
			cur[x]=head[x];
			for(int i=head[x];i!=0;i=e[i].nxt)
			{
				if(vis[e[i].to]==0&&e[i].cap>e[i].flow&&i<=limit)
				{
					dis[e[i].to]=dis[x]+1;
					q.push(e[i].to);  vis[e[i].to]=1;
					if(e[i].to==t)  return true;
				}
			}
		}
		return false;
	}
	int dfs(int x,int t,int flow)
	{
		if(x==t)  return flow;
		int sum=0,tmp;
		for(int i=cur[x];i!=0&&sum<flow;i=e[i].nxt)
		{
			cur[x]=i;
			if(dis[e[i].to]==dis[x]+1&&e[i].cap>e[i].flow&&i<=limit)
			{
				tmp=dfs(e[i].to,t,min(e[i].cap-e[i].flow,flow-sum));
				if(tmp==0)  dis[e[i].to]=0;
				sum+=tmp;
				e[i].flow+=tmp;  e[i^1].flow-=tmp;
			}
		}
		return sum;
	}
	int Dinic(int s,int t)
	{
		int flow=0;
		while(bfs(s,t)==true)  flow+=dfs(s,t,inf);
		return flow;
	}
	bool check(int n,int s,int t)
	{
		int _s=n+1,_t=n+2,sum=0,tmp;
		_add(t,s,inf,0);  tmp=head[t];
		for(int i=1;i<=n;i++)
		{
			if(f[i]>0)
			{
				sum+=f[i];
				add(_s,i,f[i]);
			}
			if(f[i]<0)  add(i,_t,-f[i]);
		}
		limit=inf;  sum-=Dinic(_s,_t);  
		limit=tmp;  val=e[limit].flow;
		e[limit].cap=e[limit].flow=e[limit^1].cap=e[limit^1].flow=0;
		return sum<=0;
	}
	int query(int s,int t)
	{
		return val+Dinic(s,t);
	}
}F;
int main()
{
// #define Isaac
#ifdef Isaac
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif	
	int n,m,s,t,c,d,x,up,down,i,j;
	while(cin>>n>>m)
	{
		F.clear();  s=n+m+1;  t=n+m+2;
		for(i=1;i<=m;i++)
		{
			cin>>x;
			F._add(n+i,t,inf,x);
		}
		for(i=1;i<=n;i++)
		{
			cin>>c>>d;
			F._add(s,i,d,0);
			for(j=1;j<=c;j++)
			{
				cin>>x>>down>>up;  x++;
				F._add(i,n+x,up,down);
			}
		}
		cout<<((F.check(n+m+2,s,t)==true)?F.query(s,t):-1)<<endl<<endl;
	}
	return 0;
}
2025/2/6 19:51
加载中...