Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker, "/STACK:256000000")
- #define _CRT_SECURE_NO_WARNINGS
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<algorithm>
- #include<iostream>
- #include<fstream>
- #include<vector>
- #include<string>
- #include<map>
- #include<set>
- #include<queue>
- #include<deque>
- #include<bitset>
- #include<sstream>
- #include<unordered_set>
- #include<unordered_map>
- using namespace std;
- typedef unsigned long long ull;
- typedef long long ll;
- typedef pair<ll, ll> pii;
- typedef pair<ll, pii> piii;
- #define xx first
- #define yy second.first
- #define zz second.second
- #define mp make_pair
- const ll MOD = (ll)1e10 + 7;
- const int dx[] = { 0, 1, 0, -1 };
- const int dy[] = { 1, 0, -1, 0 };
- const int MAXN = (int)1e6 + 5;
- const int MAXH = 21;
- struct edge
- {
- int v, to;
- ll cap, fl;
- edge() {};
- edge(int v, int to, ll cap) : v(v), to(to), cap(cap), fl(0) {};
- };
- vector<edge> e(0);
- vector<int> g[MAXN];
- int used[MAXN];
- ll d[MAXN];
- ll s, t, n, m;
- ll k;
- bool bfs()
- {
- queue<int> q;
- q.push(s);
- for (int i = 0; i < 2 * n + 2; i++)
- d[i] = MOD;
- d[s] = 0;
- while (!q.empty())
- {
- int v = q.front();
- q.pop();
- for (int i = 0; i < g[v].size(); i++)
- {
- int ei = g[v][i];
- int to = e[ei].to;
- ll cap = e[ei].cap - e[ei].fl;
- if (d[to] > d[v] + 1 && cap > 0)
- {
- d[to] = d[v] + 1;
- q.push(to);
- }
- }
- }
- return (d[t] < MOD);
- }
- ll dfs(int v, ll flow)
- {
- if (v == t)
- return flow;
- for (; used[v] < g[v].size(); used[v]++)
- {
- int ei = g[v][used[v]], to = e[ei].to;
- ll cap = e[ei].cap - e[ei].fl;
- if (cap > 0 && d[to] == d[v] + 1)
- {
- ll mfl = min(cap, flow);
- mfl = dfs(to, mfl);
- if (mfl > 0)
- {
- e[ei].fl += mfl;
- e[ei ^ 1].fl -= mfl;
- return mfl;
- }
- }
- }
- return 0ll;
- }
- ll cnt[MAXN];
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- cin >> k >> n >> m >> s >> t;
- s--, t--;
- if (s == t)
- {
- cout << "NO";
- return 0;
- }
- for (int i = 0; i < n; i++)
- cin >> cnt[i];
- for (int i = 0; i < m; i++)
- {
- int v, to;
- cin >> v >> to;
- v--, to--;
- if (to != s || v != t)
- {
- g[2 * v + 1].push_back(e.size());
- e.push_back(edge(2 * v + 1, 2 * to, MOD));
- g[2 * to].push_back(e.size());
- e.push_back(edge(2 * to, 2 * v + 1, 0));
- }
- if (to != t || v != s)
- {
- g[2 * to + 1].push_back(e.size());
- e.push_back(edge(2 * to + 1, 2 * v, MOD));
- g[2 * v].push_back(e.size());
- e.push_back(edge(2 * v, 2 * to + 1, 0));
- }
- }
- for (int i = 0; i < n; i++)
- {
- if (i == s || i == t)
- continue;
- g[2 * i].push_back(e.size());
- e.push_back(edge(2 * i, 2 * i + 1, cnt[i]));
- g[2 * i + 1].push_back(e.size());
- e.push_back(edge(2 * i + 1, 2 * i, 0));
- }
- s = s * 2 + 1;
- t = t * 2;
- ll ans = 0;
- while (bfs())
- {
- for (int i = 0; i < 2 * n; i++)
- used[i] = 0;
- ll fl = 0;
- while (fl = dfs(s, MOD))
- {
- ans += fl;
- }
- }
- if (ans > k)
- cout << "NO";
- else
- cout << "YES";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement