求助!前三个点WA了
查看原帖
求助!前三个点WA了
157857
ImmortalWatcher楼主2021/7/6 22:07

最后一个点过了

#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int inf=2147483647;
int n,m,G,s,t,ve[1000010],TT,C,D,S,T,tot,L,R,gap[1000010],dis[1000010],cur[1000010];
struct node{int last,en,next,v;} e[1000010];
inline int min(int x,int y){return x<y?x:y;}
void add(int x,int y,int z)
{
	e[++tot].en=y;e[tot].v=z;e[tot].next=e[x].last;e[x].last=tot;
	e[++tot].en=x;e[tot].v=0;e[tot].next=e[y].last;e[y].last=tot;
}
int dfs(int k,int flow)
{
	if (k==T) return flow;
	int have=0;
	for (int i=cur[k];i;i=e[i].next)
		if (dis[e[i].en]+1==dis[k]&&e[i].v)
		{
			cur[k]=i;
			int now=dfs(e[i].en,min(flow-have,e[i].v));
			e[i].v-=now;
			e[i^1].v+=now;
			have+=now;
			if (have==flow) return have;
		}		
	cur[k]=e[k].last;
	if (!(--gap[dis[k]])) dis[S]=T+1;
	++gap[++dis[k]];
	return have;
}
int dfs()
{
	memset(gap,0,sizeof(gap));
	memset(dis,0,sizeof(dis));
	memset(cur,0,sizeof(cur));
	int ans=0;
	gap[0]=T+1;
	while (dis[S]<T+1) ans+=dfs(S,inf);
	return ans;
}
signed main()
{
	while (~scanf("%lld%lld",&n,&m))
	{
		memset(e,0,sizeof(e));
		memset(ve,0,sizeof(ve));
		s=0;t=n+m+1;tot=1;
		for (int i=1;i<=m;i++)
		{
			scanf("%lld",&G);
			add(s,i,inf-G);
			ve[i]+=G;
			ve[s]-=G;
		}
		for (int i=1;i<=n;i++)
		{
			scanf("%lld%lld",&C,&D);
			add(m+i,t,D);
			for (int j=1;j<=C;j++)
			{
				scanf("%lld%lld%lld",&TT,&L,&R);TT++;
				add(TT,m+i,R-L);
				ve[TT]-=L;
				ve[m+i]+=L;
			}	
		}
		S=m+n+2;T=m+n+3;
		int outflow=0;
		for (int i=0;i<=n+m+1;i++)
			if (ve[i]>0) add(S,i,ve[i]),outflow+=ve[i];
			else if (ve[i]<0) add(i,T,-ve[i]);
		add(t,s,inf);
		if (dfs()<outflow) printf("-1\n\n");
		else 
		{
			int res=e[tot].v;
			e[tot].v=e[tot^1].v=0;
			S=s;T=t;
			printf("%lld\n\n",res+dfs());
		}
	}
	return 0;
}
2021/7/6 22:07
加载中...