求助T前三个点!
查看原帖
求助T前三个点!
25891
沧桑の天骄楼主2021/12/17 13:27
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline ll read()
{
	ll x=0,w=1;
	char aa=getchar();
	while(aa<'0'||aa>'9')
	{
		if(aa=='-')
		{
			w=-1;
		}
		aa=getchar();
	}
	while(aa>='0'&&aa<='9')
	{
		x=(x<<3)+(x<<1)+aa-'0';
		aa=getchar();
	}
	return x*w;
}
inline void write(ll x)
{
	if(x<0)
	{
		putchar('-');
		x=-1;
	}
	if(x>9)
	{
		write(x/10);
	}
	putchar(x%10+'0');
}
const int N=1e6+10,inf=2e9+7;
struct node{
	int ver,nt,flow;
}e[N];
int n,m,c,d,ans,s1,t1,s2,t2,top=1;
int hd[N],dis[N],in[N],out[N],now[N];
queue<int> q;

void init(){
	top=1;
	memset(hd,0,sizeof(hd));
	memset(in,0,sizeof(in));
	memset(out,0,sizeof(out));
}

void add(int x,int y,int z){
	e[++top].ver=y;
	e[top].flow=z;
	e[top].nt=hd[x];
	hd[x]=top;
}

bool bfs(int s,int t){
	memset(dis,-1,sizeof(dis));
	q.push(s);
	dis[s]=0;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=hd[x];i;i=e[i].nt){
			int y=e[i].ver;
			if(e[i].flow&&dis[y]==-1){
				dis[y]=dis[x]+1;
				q.push(y);
			}
		}
	}
	return dis[t]!=-1;
}

int dfs(int x,int t,int ma){
	if(x==t){
		return ma;
	}
	int su=ma;
	for(int i=now[x];i;i=e[i].nt){
		now[x]=e[i].nt;
		int y=e[i].ver;
		if(e[i].flow&&dis[y]==dis[x]+1){
			int d=dfs(y,t,min(su,e[i].flow));
			su-=d;
			e[i].flow-=d;
			e[i^1].flow+=d;
			if(!su){
				return ma;
			}
		}
	}
	return ma-su;
}

int dinic(int s,int t){
	int ss=0;
	while(bfs(s,t)){
		for(int i=1;i<=n+m+4;i++){
			now[i]=hd[i];
		}
		ss+=dfs(s,t,inf);
	}
	return ss;
}

int main()
{
	int x,y,t,l,r;
	while(cin>>n>>m){
		init();
		s1=n+m+1,t1=n+m+2,s2=n+m+3,t2=n+m+4;
		for(int i=1;i<=m;i++){
			x=read();
			out[n+i]+=x,in[t1]+=x;
			add(n+i,t1,inf-x);
			add(t1,n+i,0);
		}
		for(int i=1;i<=n;i++){
			c=read(),d=read();
			add(s1,i,d);
			add(i,s1,0);
			for(int j=1;j<=c;j++){
				t=read()+1,l=read(),r=read();
				out[i]+=l,in[n+t]+=l;
				add(i,n+t,r-l);
				add(n+t,i,0);
			}
		}
		int sum=0;
		for(int i=1;i<=n+m+2;i++){
			if(in[i]>out[i]){
				add(s2,i,in[i]-out[i]);
				add(i,s2,0);
				sum+=in[i]-out[i];
			}
			if(in[i]<out[i]){
				add(i,t2,out[i]-in[i]);
				add(t2,i,0);
			}
		}
		add(t1,s1,inf);
		add(s1,t1,0);
		if(dinic(s2,t2)!=sum){
			puts("-1");
			puts("");
			continue;
		}
		for(int i=hd[t1];i;i=e[i].nt){
			if(e[i].ver==s1){
				ans=e[i^1].flow;
				e[i].flow=e[i^1].flow=0;
				break;
			}
		}
		printf("%lld\n",ans+dinic(s1,t1));
		puts("");
	}
	return 0;
}
2021/12/17 13:27
加载中...