1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
| #include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int INF = 1000000007;
int getint() {
int r = 0, k = 1; char c = getchar();
for (; '0' > c || c > '9'; c = getchar()) if (c == '-') k = -1;
for (; '0' <= c && c <= '9'; c = getchar()) r = r * 10 - '0' + c;
return r * k;
}
const int maxm = 520005;
struct edge_type {
int to, next, r;
} edge[maxm];
int Q[666], cnte = 1, h[666], cur[666], S, T, d[666];
void ins(int x, int y, int z) {
edge[++cnte].to = y;
edge[cnte].next = h[x];
edge[cnte].r = z;
h[x] = cnte;
edge[++cnte].to = x;
edge[cnte].next = h[y];
edge[cnte].r = 0;
h[y] = cnte;
}
bool BFS() {
int head = 0, tail = 1;
for (int i = 0; i <= T; ++i) d[i] = -1;
Q[0] = S; d[S] = 1;
int now;
while (head < tail) {
now = Q[head++];
for (int i = h[now]; i; i = edge[i].next) {
if (edge[i].r && d[edge[i].to] == -1) {
d[edge[i].to] = d[now] + 1;
Q[tail++] = edge[i].to;
}
}
}
return (d[T]!=-1);
}
int dfs(int now, int a) {
if (a == 0 || now == T) return a;
int ret = 0, f;
for (int &i = cur[now]; i; i = edge[i].next) {
if (d[edge[i].to] != d[now] + 1) continue;
if (f = dfs(edge[i].to, min(a, edge[i].r))) {
ret += f;
a -= f;
edge[i].r -= f;
edge[i^1].r += f;
}
if (!a) break;
}
if (!ret) d[now] = -1;
return ret;
}
int A[maxm>>2], B[maxm>>2], C[maxm>>2], D[maxm>>2];
int F[666][666];
int main() {
int n = getint(), m = getint();
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j)
F[i][j] = INF;
F[i][i] = 0;
}
S = 1; T = n;
for (int i = 1; i <= m; ++i) {
A[i] = getint(); B[i] = getint(); C[i] = getint(); D[i] = getint();
F[A[i]][B[i]] = F[B[i]][A[i]] = min(C[i], F[A[i]][B[i]]);
}
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
F[i][j] = min(F[i][j], F[i][k] + F[k][j]);
int ans1 = F[1][n];
for (int i = 1; i <= m; ++i) {
if (F[1][A[i]] + C[i] + F[B[i]][n] == ans1) {
ins(A[i], B[i], D[i]);
}
if (F[1][B[i]] + C[i] + F[A[i]][n] == ans1) {
ins(B[i], A[i], D[i]);
}
}
int ans2 = 0;
while (BFS()) {
for (int i = S; i <= T; ++i) cur[i] = h[i];
ans2 += dfs(S, INF);
}
printf("%d\n%d", ans1, ans2);
return 0;
}
|