网络流

直接贴代码(Dinic)

struct node
{
	int next, to, val, type, from;
}a[160005];
int head[100005], cnt = 1, first[100005], T = 100000;
void add(int x, int y, int w, int ty)
{
	a[++ cnt].next = head[x];
	a[cnt].to = y;
	a[cnt].val = w;
	a[cnt].type = ty;
	a[cnt].from = x;
	head[x] = cnt;
}
int dep[100005];
bool bfs(int U)
{
	queue<int> q;
	q.push(U);
	memset(dep, 0x3f, sizeof(dep));
	dep[U] = 1;
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		for(int i = head[u]; i != 0; i = a[i].next)
		{
			int v = a[i].to;
			if(a[i].val > 0 && dep[v] > dep[u] + 1)
			{
				dep[v] = dep[u] + 1;
				q.push(v);
			}
		}
	}
	return dep[T] != 0x3f3f3f3f;
}
int dfs(int u, int lim)
{
	if(u == T) return lim;
	int flow = 0, i;
	for(i = first[u]; i != 0; i = a[i].next)
	{
		int v = a[i].to;
		if(a[i].val > 0 && dep[v] == dep[u] + 1)
		{
			int del = dfs(v, min(lim - flow, a[i].val));
			if(del == 0) dep[v] = -1;
			a[i].val -= del;
			a[i ^ 1].val += del;
			flow += del;
			if(flow == lim) break;
		}
	}
	first[u] = i;
	return flow;
}

最小割

最小割等于最大流

posted @ 2025-04-08 19:30  yuzihang  阅读(8)  评论(0)    收藏  举报