#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;
}
提交记录,rt