int n, m; // n是节点数,m是边数 vector<int> adj[MAXN]; // 邻接表 int capacity[MAXN][MAXN]; // 容量矩阵 int flow[MAXN][MAXN]; // 流量矩阵
// 寻找增广路径的DFS booldfs(int u, int t, int f, vector<int>& visited){ if (u == t) returntrue; visited[u] = 1; for (int v : adj[u]) { if (!visited[v] && capacity[u][v] > flow[u][v]) { if (dfs(v, t, min(f, capacity[u][v] - flow[u][v]), visited)) { flow[u][v] += f; flow[v][u] -= f; returntrue; } } } returnfalse; }
// 最大流计算 intfordFulkerson(int source, int sink){ memset(flow, 0, sizeof(flow)); // 初始化流量矩阵 int maxFlow = 0;
while (true) { vector<int> visited(n, 0); int f = 0; if (!dfs(source, sink, INF, visited)) break; // 如果没有增广路径,结束 maxFlow += f; } return maxFlow; }
intmain(){ cin >> n >> m; for (int i = 0; i < m; i++) { int u, v, c; cin >> u >> v >> c; adj[u].push_back(v); adj[v].push_back(u); capacity[u][v] += c; // 有可能是多条边,容量累加 } cout << fordFulkerson(0, n-1) << endl; // 假设源点是0,汇点是n-1 return0; }
int n, m; // n是节点数,m是边数 vector<int> adj[MAXN]; // 邻接表 int capacity[MAXN][MAXN]; // 容量矩阵 int flow[MAXN][MAXN]; // 流量矩阵
// 使用BFS寻找增广路径 boolbfs(int source, int sink, vector<int>& parent){ fill(parent.begin(), parent.end(), -1); // 重置父节点 parent[source] = source; queue<int> q; q.push(source); while (!q.empty()) { int u = q.front(); q.pop(); for (int v : adj[u]) { if (parent[v] == -1 && capacity[u][v] > flow[u][v]) { parent[v] = u; if (v == sink) returntrue; q.push(v); } } } returnfalse; }
// 最大流计算 intedmondsKarp(int source, int sink){ memset(flow, 0, sizeof(flow)); // 初始化流量矩阵 int maxFlow = 0; vector<int> parent(n);
while (bfs(source, sink, parent)) { int pathFlow = INF; for (int v = sink; v != source; v = parent[v]) { int u = parent[v]; pathFlow = min(pathFlow, capacity[u][v] - flow[u][v]); }
// 更新流量 for (int v = sink; v != source; v = parent[v]) { int u = parent[v]; flow[u][v] += pathFlow; flow[v][u] -= pathFlow; }
maxFlow += pathFlow; } return maxFlow; }
intmain(){ cin >> n >> m; for (int i = 0; i < m; i++) { int u, v, c; cin >> u >> v >> c; adj[u].push_back(v); adj[v].push_back(u); capacity[u][v] += c; // 有可能是多条边,容量累加 } cout << edmondsKarp(0, n-1) << endl; // 假设源点是0,汇点是n-1 return0; }
for (int v : adj[u]) { if (level[v] == -1 && capacity[u][v] > flow[u][v]) { level[v] = level[u] + 1; if (v == sink) returntrue; q.push(v); } } } returnfalse; }
// DFS用于增广路径的寻找 intdfs(int u, int sink, int f){ if (u == sink) return f; for (int v : adj[u]) { if (level[v] == level[u] + 1 && capacity[u][v] > flow[u][v]) { int pathFlow = min(f, capacity[u][v] - flow[u][v]); int pushed = dfs(v, sink, pathFlow); if (pushed) { flow[u][v] += pushed; flow[v][u] -= pushed; return pushed; } } } return0; }
// 最大流计算 intdinic(int source, int sink){ memset(flow, 0, sizeof(flow)); // 初始化流量矩阵 int maxFlow = 0;
while (bfs(source, sink)) { while (true) { int pushed = dfs(source, sink, INF); if (pushed == 0) break; maxFlow += pushed; } } return maxFlow; }
intmain(){ cin >> n >> m; for (int i = 0; i < m; i++) { int u, v, c; cin >> u >> v >> c; adj[u].push_back(v); adj[v].push_back(u); capacity[u][v] += c; // 有可能是多条边,容量累加 } cout << dinic(0, n-1) << endl; // 假设源点是0,汇点是n-1 return0; }