52求调,玄关
查看原帖
52求调,玄关
1023774
rui_de_aihao楼主2024/11/28 21:52
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>

using namespace std;

const int M = 32;
const int MM = 1000;
const int INF = 0x3f3f3f3f;

struct Edge {
	int to, next, cap, flow;
} w[MM * 2];

int head[M], level[M], cur[M];
int n, m;
int cnt = 0;

void ae(int from, int to, int cap) {
	w[cnt].to = to;
	w[cnt].cap = cap;
	w[cnt].flow = 0;
	w[cnt].next = head[from];
	head[from] = cnt++;
	w[cnt].to = from;
	w[cnt].cap = 0;
	w[cnt].flow = 0;
	w[cnt].next = head[to];
	head[to] = cnt++;
}

bool bfs(int s, int t) {
	memset(level, -1, sizeof(level));
	queue<int> q;
	q.push(s);
	level[s] = 0;
	while (!q.empty()) {
		int now = q.front();
		q.pop();
		for (int i = head[now]; i!= -1; i = w[i].next) {
			int v = w[i].to;
			if (level[v] == -1 && w[i].cap > w[i].flow) {
				level[v] = level[now] + 1;
				q.push(v);
			}
		}
	}
	return level[t]!= -1;
}

int dfs(int u, int t, int flow) {
	if (u == t) {
		return flow;
	}
	for (int& i = cur[u]; i!= -1; i = w[i].next) {
		int v = w[i].to;
		if (level[v] == level[u] + 1 && w[i].cap > w[i].flow) {
			int f = dfs(v, t, min(flow, w[i].cap - w[i].flow));
			if (f > 0) {
				w[i].flow += f;
				w[i ^ 1].flow -= f;
				return f;
			}
		}
	}
	return 0;
}

int dc(int s, int t) {
	int ans = 0;
	while (bfs(s, t)) {
		memcpy(cur, head, sizeof(head));
		while (int f = dfs(s, t, INF)) ans += f;
	}
	return ans;
}

int main() {
	cin >> n >> m;
	memset(head, -1, sizeof(head));
	for (int i = 0; i < m; i++) {
		int s, e, c;
		cin >> s >> e >> c;
		ae(s, e, c);
	}
	int mt = dc(1, n);
	int cs = 0;
	for (int i = head[1]; i!= -1; i = w[i].next) {
		if (w[i].flow > 0) cs++;
	}
	cout << mt << " " << cs << endl;
	return 0;
}

提交记录,rtrt

2024/11/28 21:52
加载中...