題目連接node
Descriptionios
Input算法
Outputapp
Sample Inputide
2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7 (3,5)2 (3,6)5 (4,2)7 (4,3)5 (4,5)1 (6,0)5 (0)5 (1)2 (3)2 (4)1 (5)4
Sample Output優化
15 6
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <queue> using namespace std; const int N = 105; const int MAXN = 1e9 + 7; struct Edge { int to; int value; int next; }e[2*N*N]; int head[N], cnt; int deep[N]; int n, np, nc, m; void insert(int u, int v, int value) { e[++cnt].to = v; e[cnt].value = value; e[cnt].next = head[u]; head[u] = cnt; } void init() { memset(head, -1, sizeof(head)); cnt = -1; } bool BFS() { memset(deep,-1,sizeof(deep)); queue<int> Q; deep[0] = 0; Q.push(0); while (!Q.empty()) { int u = Q.front(); Q.pop(); for (int edge = head[u]; edge != -1; edge = e[edge].next) { int v = e[edge].to; if (deep[v] == -1 && e[edge].value > 0) { deep[v] = deep[u] + 1; Q.push(v); } } } if (deep[n + 1] == -1) return false; return true; } int DFS(int u,int flow_pre) { if (u == n + 1) return flow_pre; int flow = 0; for (int edge = head[u]; edge != -1; edge = e[edge].next) { int v = e[edge].to; if (deep[v] != deep[u]+1 || e[edge].value==0) continue; int _flow= DFS(v, min(flow_pre, e[edge].value)); flow_pre -= _flow; flow += _flow; e[edge].value -= _flow; e[edge ^ 1].value += _flow; if (flow_pre == 0) break; } if (flow == 0) deep[u] = -1; return flow; } int GetMaxFlow() { int ans = 0; while (BFS()) { ans += DFS(0,MAXN); } return ans; } int main() { while (scanf("%d%d%d%d", &n, &np, &nc, &m) != EOF) { init(); int u, v, z; for (int i = 0; i < m; i++) { scanf(" (%d,%d)%d", &u, &v, &z); insert(u+1, v+1, z); insert(v+1, u+1, 0); } for (int i = 0; i < np; i++) { scanf(" (%d)%d", &u, &z); insert(0, u+1, z); insert(u+1, 0, 0); } for (int i = 0; i < nc; i++) { scanf(" (%d)%d", &u, &z); insert(u + 1, n + 1, z); insert(n + 1, u + 1, 0); } printf("%d\n",GetMaxFlow()); } }