P5192|1~3WA其余AC|悬2关求调!
查看原帖
P5192|1~3WA其余AC|悬2关求调!
1601965
fangtongsheng楼主2025/6/14 19:53

错误样例I:(测试点#1)

数据连接|Input&Answer

#include<bits/stdc++.h>
#define fileio(filename) freopen(filename".in","r",stdin),freopen(filename".out","w",stdout)
#define int long long
using namespace std;
namespace FastIO {
	inline int read() {
		int x=0;char ch=getchar();bool ty=1;
		while(ch<'0'||ch>'9') {
			if(ch=='-') ty=0;
			ch=getchar();
		}
		while(ch<='9'&&ch>='0') {
			x=(x<<3)+(x<<1)+(ch^48);
			ch=getchar();
		}
		return ty?x:-x;
	}
	void Wtt(int x) {
		if(x>9)
			Wtt(x/10);
		putchar(x%10+48);
	}
	void pt(int x) {
		if(x>0) Wtt(x);
		else if(x<0) putchar('-') ,Wtt(-x);
		else putchar('0');
	}
}
using namespace FastIO;
const int inf = 1e18;
const int N = 100100 ;
const int M = 1001001 ;
int n,m;
int val[M<<1],to[M<<1],nxt[M<<1],h[N],now[N],Cntedge=1,dep[N];
void ade(int u,int v,int w) {
	Cntedge++;
	val[Cntedge]=w;
	to[Cntedge]=v;
	nxt[Cntedge]=h[u];
	h[u]=Cntedge;
	Cntedge++;
	val[Cntedge]=0;
	to[Cntedge]=u;
	nxt[Cntedge]=h[v];
	h[v]=Cntedge;
}
int s,t,SS,TT,more[N];
void edge(int u,int v,int l,int r) {
	more[u]-=l,more[v]+=l;
	ade(u,v,r-l);
}
queue<int> Q;

// Dinic Start 

bool bfs(int s,int t) {
	for(int i=0;i<N;i++) dep[i]=inf;
	while(!Q.empty()) Q.pop();
	Q.push(s);
	dep[s]=1,now[s]=h[s];
	while(!Q.empty()) {
		int u=Q.front();Q.pop();
		for(int i=h[u];i;i=nxt[i]) {
			int v=to[i];
			if(val[i]>0&&dep[v]==inf) {
				dep[v]=dep[u]+1;
				now[v]=h[v];
				Q.push(v);
			}
		}
	}
	return dep[t]!=inf;
}
int dfs(int u,int t,int flow) {
	if(u==t) return flow;
	int res=0,tmp;
	for(int i=now[u];i&&flow;i=nxt[i]) {
		int v=to[i];
		if(dep[v]==dep[u]+1&&val[i]>0) {
			now[u]=i;
			tmp=dfs(v,t,min(flow,val[i]));
			if(tmp==0) dep[v]=inf;
			val[i]-=tmp;
			val[i^1]+=tmp;
			res+=tmp;
			flow-=tmp;
		}
	}
	return res;
}
int dnic(int s,int t) {
	int answer=0;
	while(bfs(s,t)) 
		answer+=dfs(s,t,inf);
	return answer;
}

// Dinic End 

signed main() {
//	fileio("P5192_1");
	while(~scanf("%lld%lld",&n,&m))
	{
		memset(more,0,sizeof(more));
		s=n+m+1,t=n+m+2,SS=s,TT=t;
		for(int i=1,g;i<=m;i++) { 
			g=read();
			edge(i+n,t,g,inf);
		}
		for(int k=1,nn,man,leas,mos,D;k<=n;k++)
		{
			nn=read(),D=read();
			edge(s,k,0,D);
			for(int i=1;i<=nn;i++)
			{
				int th=read()+1,les=read(),mos=read();
				edge(k,n+th,les,mos);
			}
		}
		SS=n+m+3,TT=n+m+4;
		int num=0;
		for(int i=1;i<=n+m+2;i++) {
			if(more[i]>0) ade(SS,i,more[i]),num+=more[i];
			else if(more[i]<0) ade(i,TT,-more[i]);
		}
		ade(t,s,inf);
		if(dnic(SS,TT)<num)
		{
			printf("-1\n\n");
			continue;
		}
		int res=val[Cntedge];
		val[Cntedge]=val[Cntedge^1]=0;
		pt(res+dnic(s,t)),putchar('\n'),putchar('\n');
		memset(h,0,sizeof(h)),memset(nxt,0,sizeof(nxt));
		memset(val,0,sizeof(val)),memset(to,0,sizeof(to));
		Cntedge=1;
	}
	return 0;
}
2025/6/14 19:53
加载中...