求助,全RE
查看原帖
求助,全RE
29093
Deep_KevinLILDOGDOG楼主2020/9/17 07:30

不知为啥全是RE,调了2h了,正常上下界网络流写法

#include<bits/stdc++.h>
using namespace std;

const int N=2010,M=200010;
struct edge{
	int y,nex,c;
}s[M<<1];
int first[N],head[N],len=1,op[N],d[N],qs[N],st,ed;
int n,m,s1,t1,s2,t2;

void ins(int x,int y,int c){s[++len]=(edge){y,first[x],c};first[x]=len;}

bool bfs(int S,int T){
	for(int i=1;i<=n+m+4;i++) first[i]=head[i],d[i]=0;
	d[qs[st=ed=1]=S]=1;
	while(st<=ed){
		int x=qs[st++];
		for(int i=first[x];i;i=s[i].nex) if(s[i].c && !d[s[i].y]){
			d[s[i].y]=d[x]+1;
			qs[++ed]=s[i].y;
		}
	}
	return d[T]!=0;
}

int dfs(int x,int ed,int t){
	if(x==ed) return t;
	int tot=0;
	for(int&i=first[x];i!=0;i=s[i].nex) if(d[s[i].y]==d[x]+1 && s[i].c){
		int now=dfs(s[i].y,ed,min(t-tot,s[i].c));
		s[i].c-=now;s[i^1].c+=now;tot+=now;
		if(tot==t) break;
	}
	return tot;
}

int Dinic(int S,int T){
	int tot=0,dx=0;
	while(bfs(S,T)){
		dx=dfs(S,T,2e9);
		while(dx) tot+=dx,dx=dfs(S,T,2e9);
	}
	return tot;
}

int main(){
	while(scanf("%d %d",&n,&m)){
		s1=n+m+1;t1=n+m+2;s2=n+m+3;t2=n+m+4;
		for(int i=1;i<=n+m+4;i++) first[i]=head[i]=op[i]=0;len=1;
		int x,tot=0;
		for(int i=1;i<=m;i++){
			scanf("%d",&x),op[n+i]-=x;op[t1]+=x;
			ins(n+i,t1,2e9),ins(t1,n+i,0);
		}
		for(int i=1;i<=n;i++){
			int C,D,T,L,R;
			scanf("%d %d",&C,&D);
			ins(s1,i,D),ins(i,s1,0);
			while(C--){
				scanf("%d %d %d",&T,&L,&R);T++;
				op[i]-=L;op[n+T]+=L;
				ins(i,n+T,R-L);ins(n+T,i,0);
			}
		}
		ins(t1,s1,2e9);ins(s1,t1,0);
		for(int i=1;i<=n+m+2;i++) 
			if(op[i]>0) ins(s2,i,op[i]),ins(i,s2,0),tot+=op[i];
			else if(op[i]<0) ins(i,t2,-op[i]),ins(t2,i,0);
		for(int i=1;i<=n+m+4;i++) head[i]=first[i];
		if(Dinic(s2,t2)!=tot) printf("-1\n\n");
		else printf("%d\n\n",Dinic(s1,t1));
	}
}
2020/9/17 07:30
加载中...