Đề bài
Cho mạng G có n đỉnh và m cạnh, đỉnh phát là 0, và đỉnh thu là n-1. Hãy tìm luồng f* trong mạng sao cho giá trị val(f*) của luồng f* là lớn nhất.Input
- Dòng đầu tiên chứa 2 số n, m là số đỉnh và số cung trong mạng G.
- M dòng tiếp theo, mỗi dòng là 3 số u, v, c cho biết cung nối từ u đến v có trọng số là c.
Output
- Ghi một số nguyên dương cho biết giá trị luồng cực đại tìm được.
Input | Output |
6 9 1 2 10 1 3 10 2 3 2 2 4 4 2 5 8 3 5 9 4 6 10 5 4 6 5 6 10 | 19 |
Minh họa
Giải
- Source code:
#include<bits/stdc++.h> #include<iostream> using namespace std; using ll = long long; const int maxN = 1001; const int INF = 1e9; // so vo cung const int NULL_INT = -1; int n, m; // n: so dinh, m: so canh int s, t; // s: dinh bat dau, t: dinh ket thuc vector<pair<int, int>> adj[maxN]; int parent[maxN]; int RC[maxN][maxN]; // luu tru cung xuoi, cung nguoc int add_flow; // luu tru gia tri luong cuc dai void inp() { cin >> n >> m; for(int i = 0; i < m; i++) { int x, y, z; cin >> x >> y >> z; adj[x].push_back({y, z}); // Do thi co huong thi comment dong code sau adj[y].push_back({x, z}); // Luu tru gia tri trong so RC[x][y] = z; } } void dfs(int u) { //cout << u << " "; for(auto item: adj[u]) { int v = item.first; int w = item.second; // Neu dinh v chua duoc tham if(parent[v] == -1 && RC[u][v]) { parent[v] = u; // Ghi nhan cha cua v la u add_flow = min(add_flow, RC[u][v]); dfs(v); } } } // Giai thuat Ford_Fulkerson // s: dinh bat dau // t: dinh ket thuc // n: so luong dinh int maxFlow_Ford_Fulkerson(int s, int t, int n) { int flow = 0; while(1) { // Khoi tao memset(parent, NULL_INT, sizeof(parent)); parent[s] = 0; add_flow = INT_MAX; dfs(s); if(parent[t] == NULL_INT) { break; } flow += add_flow; int v = t; while(v != s) { int u = parent[v]; RC[v][u] += add_flow; // cung nguoc RC[u][v] -= add_flow; // cung xuoi v = u; } } return flow; } int main() { // Chuyen NHAP, XUAT thanh file freopen("lab_8_input.INP", "r", stdin); freopen("lab_8_output.OUT", "w", stdout); // INPUT inp(); // OUTPUT int s = 1; int t = n; cout << maxFlow_Ford_Fulkerson(s, t, n); return 0; }
Mục lục
Chương trình học
-
Lý thuyết đồ thị
31
- Các khái niệm cơ bản về Lý thuyết Đồ thị #11087
- Biểu diễn đồ thị trên máy tính bằng Ma trận kề #11112
- Biểu diễn đồ thị trên máy tính bằng Danh sách cạnh #11117
- Biểu diễn đồ thị trên máy tính bằng Danh sách kề #11116
- Lab 1 - Chuyển Danh sách cạnh sang Ma trận kề #11138
- Lab 1.2 - Chuyển Danh sách cạnh sang Danh sách kề #11144
- Lab 1.3 - Chuyển Ma trận kề sang Danh sách cạnh #11151
- Lab 1.4 - Chuyển Ma trận kề sang Danh sách kề #11154
- Lab 1.5 - Chuyển Danh sách kề sang Ma trận kề #11158
- Lab 1.6 - Chuyển Danh sách kề sang Danh sách cạnh #11161
- Duyệt cây theo chiều sâu DFS (Depth First Search) #10963
- Duyệt cây theo chiều rộng BFS (Breadth First Search) #11081
- Thuật toán Tìm đường đi giữa 2 đỉnh của Đồ thị bằng C/C++ #11079
- Lab 2 - Duyệt cây theo chiều sâu DFS (Depth First Search) #11167
- Lab 2.2 - Tìm đường đi bằng cách duyệt cây theo chiều sâu DFS (Depth First Search) #11168
- Lab 3 - Duyệt cây theo chiều rộng BFS (Breadth First Search) #11169
- Lab 3.2 - Tìm đường đi bằng cách duyệt cây theo chiều rộng BFS (Breadth First Search) #11170
- Lab 4 - Tìm các thành phần liên thông trên đồ thị vô hướng #11179
- Tìm đường đi ngắn nhất bằng Thuật toán Dijkstra #11403
- Lab 5 - Tìm đường đi ngắn nhất từ đỉnh S đến tất cả các đỉnh còn lại trên đồ thị (sử dụng thuật toán Dijkstra) #11418
- Lab 5.1 - Tìm đường đi ngắn nhất từ đỉnh S đến đỉnh T trên đồ thị (sử dụng thuật toán Dijkstra) #11423
- Thuật toán Kruskal – Tìm cây khung (bao trùm) nhỏ nhất #11485
- Lab 6 - Tìm cây khung (bao trùm) cực tiểu nhỏ nhất (sử dụng thuật toán Kruskal) #11486
- Thuật toán Prim - Tìm cây khung (bao trùm) nhỏ nhất #11516
- Lab 6.1 - Tìm cây khung (bao trùm) cực tiểu nhỏ nhất (sử dụng thuật toán PRIM) #11515
- Chu trình và đường đi Euler #11519
- Lab 7 - Tìm chu trình Euler #11520
- Lab 7.1 - Tìm đường đi Euler #11528
- Bài toán Luồng cực đại #11532
- Lab 8 - Tìm luồng cực đại - sử dụng thuật toán Ford - Fulkerson #11533
- Lab 8.1 - Tìm luồng cực đại - sử dụng thuật toán Edmonds - Karp (Shortest path) #11534
- Tài liệu tham khảo 2
- Quy hoạch động 1
Các bài học
Bài học trước Bài học tiếp theo
Chương trình học
Bao gồm Module, Chương, Bài học, Bài tập, Kiểm tra...Chương trình học
-
Lý thuyết đồ thị
31
- Các khái niệm cơ bản về Lý thuyết Đồ thị #11087
- Biểu diễn đồ thị trên máy tính bằng Ma trận kề #11112
- Biểu diễn đồ thị trên máy tính bằng Danh sách cạnh #11117
- Biểu diễn đồ thị trên máy tính bằng Danh sách kề #11116
- Lab 1 - Chuyển Danh sách cạnh sang Ma trận kề #11138
- Lab 1.2 - Chuyển Danh sách cạnh sang Danh sách kề #11144
- Lab 1.3 - Chuyển Ma trận kề sang Danh sách cạnh #11151
- Lab 1.4 - Chuyển Ma trận kề sang Danh sách kề #11154
- Lab 1.5 - Chuyển Danh sách kề sang Ma trận kề #11158
- Lab 1.6 - Chuyển Danh sách kề sang Danh sách cạnh #11161
- Duyệt cây theo chiều sâu DFS (Depth First Search) #10963
- Duyệt cây theo chiều rộng BFS (Breadth First Search) #11081
- Thuật toán Tìm đường đi giữa 2 đỉnh của Đồ thị bằng C/C++ #11079
- Lab 2 - Duyệt cây theo chiều sâu DFS (Depth First Search) #11167
- Lab 2.2 - Tìm đường đi bằng cách duyệt cây theo chiều sâu DFS (Depth First Search) #11168
- Lab 3 - Duyệt cây theo chiều rộng BFS (Breadth First Search) #11169
- Lab 3.2 - Tìm đường đi bằng cách duyệt cây theo chiều rộng BFS (Breadth First Search) #11170
- Lab 4 - Tìm các thành phần liên thông trên đồ thị vô hướng #11179
- Tìm đường đi ngắn nhất bằng Thuật toán Dijkstra #11403
- Lab 5 - Tìm đường đi ngắn nhất từ đỉnh S đến tất cả các đỉnh còn lại trên đồ thị (sử dụng thuật toán Dijkstra) #11418
- Lab 5.1 - Tìm đường đi ngắn nhất từ đỉnh S đến đỉnh T trên đồ thị (sử dụng thuật toán Dijkstra) #11423
- Thuật toán Kruskal – Tìm cây khung (bao trùm) nhỏ nhất #11485
- Lab 6 - Tìm cây khung (bao trùm) cực tiểu nhỏ nhất (sử dụng thuật toán Kruskal) #11486
- Thuật toán Prim - Tìm cây khung (bao trùm) nhỏ nhất #11516
- Lab 6.1 - Tìm cây khung (bao trùm) cực tiểu nhỏ nhất (sử dụng thuật toán PRIM) #11515
- Chu trình và đường đi Euler #11519
- Lab 7 - Tìm chu trình Euler #11520
- Lab 7.1 - Tìm đường đi Euler #11528
- Bài toán Luồng cực đại #11532
- Lab 8 - Tìm luồng cực đại - sử dụng thuật toán Ford - Fulkerson #11533
- Lab 8.1 - Tìm luồng cực đại - sử dụng thuật toán Edmonds - Karp (Shortest path) #11534
- Tài liệu tham khảo 2
- Quy hoạch động 1
Bài học trước Bài học tiếp theo
Menu Tiện ích
Menu Hướng dẫn Học tập
❤🧡💛💚💙💜 Học là phải THỰC HÀNH ❤🧡💛💚💙💜
Thực hiện các bước tuần tự theo nội dung Bài học nhé!