| 12
 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
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 
 | #include <bits/stdc++.h>using namespace std;
 using LL = long long;
 #define FOR(i, x, y) for (decay<decltype(y)>::type i = (x), _##i = (y); i < _##i; ++i)
 #define FORD(i, x, y) for (decay<decltype(x)>::type i = (x), _##i = (y); i > _##i; --i)
 #ifdef zerol
 #define dbg(args...) do { cout << "\033[32;1m" << #args << " -> "; err(args); } while (0)
 #else
 #define dbg(...)
 #endif
 void err() { cout << "\033[39;0m" << endl; }
 template<template<typename...> class T, typename t, typename... Args>
 void err(T<t> a, Args... args) { for (auto x: a) cout << x << ' '; err(args...); }
 template<typename T, typename... Args>
 void err(T a, Args... args) { cout << a << ' '; err(args...); }
 
 const int N = 2000 + 100, INF = 1E9, inf = 5000;
 
 struct E {
 int from, to, cp, v;
 E() {}
 E(int f, int t, int cp, int v) : from(f), to(t), cp(cp), v(v) {}
 };
 
 struct MCMF {
 int n, m, s, t;
 vector<E> edges;
 vector<int> G[N];
 bool inq[N];
 int d[N];
 int p[N];
 int a[N];
 
 void init(int _n, int _s, int _t) {
 n = _n; s = _s; t = _t;
 FOR (i, 0, n + 1) G[i].clear();
 edges.clear(); m = 0;
 }
 
 void addedge(int from, int to, int cap, int cost) {
 edges.emplace_back(from, to, cap, cost);
 edges.emplace_back(to, from, 0, -cost);
 G[from].push_back(m++);
 G[to].push_back(m++);
 }
 
 bool BellmanFord(int &flow, int &cost) {
 FOR (i, 0, n + 1) d[i] = INF;
 memset(inq, 0, sizeof inq);
 d[s] = 0, a[s] = INF, inq[s] = true;
 queue<int> Q; Q.push(s);
 while (!Q.empty()) {
 int u = Q.front(); Q.pop();
 inq[u] = false;
 for (int& idx: G[u]) {
 E &e = edges[idx];
 if (e.cp && d[e.to] > d[u] + e.v) {
 d[e.to] = d[u] + e.v;
 p[e.to] = idx;
 a[e.to] = min(a[u], e.cp);
 if (!inq[e.to]) {
 Q.push(e.to);
 inq[e.to] = true;
 }
 }
 }
 }
 if (d[t] == INF) return false;
 flow += a[t];
 cost += a[t] * d[t];
 int u = t;
 while (u != s) {
 edges[p[u]].cp -= a[t];
 edges[p[u] ^ 1].cp += a[t];
 u = edges[p[u]].from;
 }
 return true;
 }
 
 int go() {
 int flow = 0, cost = 0;
 while (BellmanFord(flow, cost));
 dbg(flow);
 return cost;
 }
 } MM;
 vector<pair<int, int>> V;
 
 int n, m, k, t;
 bool check(int c) {
 MM.init(n + 1, n, n - 1);
 MM.addedge(n, 0, k, 0);
 for (auto& x: V) {
 MM.addedge(x.first, x.second, c + 1, 0);
 MM.addedge(x.second, x.first, c + 1, 0);
 MM.addedge(x.first, x.second, inf, 1);
 MM.addedge(x.second, x.first, inf, 1);
 }
 int cost = MM.go();
 dbg(c, cost);
 return cost <= t;
 
 }
 
 int main() {
 cin >> n >> m >> k >> t;
 FOR (_, 0, m) {
 int u, v; scanf("%d%d", &u, &v);
 V.emplace_back(u, v);
 }
 int l = 0, r = k, ans = -1;
 while (l <= r) {
 int m = (l + r) / 2;
 if (check(m)) { r = m - 1; ans = m; }
 else l = m + 1;
 }
 cout << ans << endl;
 }
 
 |