求助各位大佬,萌新T飞了
查看原帖
求助各位大佬,萌新T飞了
248872
y_dove楼主2020/8/13 22:56

rt,是写丑了吗

/*模板:有源汇上下界最大流*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn = 2e5 + 10;
#define INF 1e8
struct E{
	int u,v,l,r;
}e[maxn*2];
int read(){
	char c = getchar();
	int x = 0;
	while(c < '0' || c > '9')	c = getchar();
	while(c >= '0' && c <= '9')		x = x * 10 + c - 48,c = getchar();
	return x;
}
int cnt = 0,ecnt;
struct Edge{
	int nxt,point,flow;
}edge[maxn*2];
int head[10010],tot;
void add(int x,int y,int flow){
	edge[++tot].nxt = head[x];edge[tot].point = y;edge[tot].flow = flow;head[x] = tot;
	edge[++tot].nxt = head[y];edge[tot].point = x;edge[tot].flow = 0;	head[y] = tot;
} 
int n,m;
int s,t,S,T;
int G[maxn];
int w[10010];
int Dep[maxn];
int cur[maxn];
int q[maxn];
bool bfs(int S,int T){
	for(int i = 1; i <= cnt; ++i)
		Dep[i] = 0,cur[i] = head[i];
	int l = 1,r = 0;
	q[++r] = S;
	Dep[S] = 1;
	while(l <= r){
		int x = q[l++];
		for(int i = head[x]; i ; i = edge[i].nxt){
			int y = edge[i].point;
			if(edge[i].flow && !Dep[y]){
				Dep[y] = Dep[x] + 1;
				q[++r] = y;
			}
		}
	}
	return (Dep[T] != 0);
}
int Dinic(int x,int flow,int T){
	if(x == T || !flow)		return flow;
	int rest = flow,k;
	for(int i = cur[x]; i ; i = edge[i].nxt){
		int y = edge[i].point;
		cur[x] = i;
		if(edge[i].flow && Dep[y] == Dep[x] + 1){
			k = Dinic(y,min(edge[i].flow,rest),T);
			if(!k)	Dep[y] = 0;
			rest -= k;
			edge[i].flow -= k;
			edge[i^1].flow += k;
		}
	}
	return flow - rest;
}
void work(){
	memset(w,0,sizeof(w));
	for(int i = 1; i <= ecnt; ++i){
		int d = e[i].r - e[i].l;
		int u = e[i].u,v = e[i].v;
		add(u,v,d);
		w[u] -= e[i].l,w[v] += e[i].l;
	}
	S = ++cnt,T = ++cnt;
	int sum = 0,mxflow = 0;
	add(t,s,INF);
	int ver = tot;
	for(int i = 1; i <= cnt; ++i){
		if(w[i] < 0)	add(i,T,-w[i]);
		else if(w[i] > 0)	add(S,i,w[i]),sum += w[i];
	}
	while(bfs(S,T)){
		mxflow += Dinic(S,INF,T);
	}	
	if(mxflow != sum){
		printf("%d\n",-1);
		puts("");
		return;
	}
	edge[ver].flow = 0,edge[ver].nxt = 0,edge[ver].point = 0;
	edge[ver^1].flow = 0,edge[ver^1].nxt = 0,edge[ver^1].point = 0;
	mxflow = 0;
	while(bfs(s,t))		mxflow += Dinic(s,INF,t);
	printf("%d\n",mxflow);
	puts("");
}
int main()
{
	while(cin >> n >> m){
		memset(head,0,sizeof(head));
		s = 0,t = 0,S = 0,T = 0,cnt = 0,ecnt = 0,tot = 1;
		s = ++cnt,t = ++cnt;
		for(int i = 1; i <= m; ++i){
			int x = read();G[i] = ++cnt;
			e[++ecnt].u = G[i],e[ecnt].v = t,e[ecnt].l = x,e[ecnt].r = INF;
		}
		for(int i = 1; i <= n; ++i){
			int c = read(),d = read();
			int day = ++cnt;
			e[++ecnt].u = s,e[ecnt].v = day,e[ecnt].l = 0,e[ecnt].r = d;
			for(int j = 1; j <= c; ++j){
				int id = read() + 1,l = read(),r = read();
				e[++ecnt].u = day,e[ecnt].v = G[id],e[ecnt].l = l,e[ecnt].r = r;
			}
		}
		work();
	}
	return 0;
}
2020/8/13 22:56
加载中...