Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <list>
- #include <algorithm>
- #include <string>
- #include <math.h>
- #include <climits>
- //#include <chrono>
- //#include <fstream>
- //#include <bits/stdc++.h>
- #define mp make_pair
- #define pb push_back
- #define eb emplace_back
- #define x first
- #define y second
- #define sz(x) (int)x.size()
- #define all(x) begin(x), end(x)
- #define rall(x) rbegin(x), rend(x)
- #define FOR(i,a,b) for (int i = (a); i < (b); i++)
- #define RFOR(i,b,a) for (int i = (b) - 1; i >= (a); i--)
- using namespace std;
- typedef unsigned long long ull;
- typedef long long ll;
- typedef long double ld;
- typedef pair<int, int> pi;
- typedef pair<ll, ll> pl;
- typedef vector<int> veci;
- typedef vector<bool> vecb;
- typedef vector<vector<int>> vvi;
- typedef vector<vector<bool>> vvb;
- const int INF_I = 1e9;
- const ll INF_LL = 1e18;
- int m, k, n;
- vvb foe;
- vecb used;
- veci p;
- bool dfs(int v) {
- if (used[v])
- return false;
- used[v] = true;
- for (int i = 0; i < k; i++)
- if (!foe[v][i] && (p[i] == -1 || dfs(p[i]))) {
- p[i] = v;
- return true;
- }
- return false;
- }
- int main() {
- /*ifstream cin("in.txt");
- ofstream cout("out.txt");
- auto start_time = chrono::high_resolution_clock::now();*/
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int t, q;
- cin >> m >> k >> n >> t;
- foe.assign(m, vecb(k));
- p.assign(k, -1);
- for (int i = 0; i < t; i++) {
- int a, b;
- cin >> a >> b;
- a--; b -= (m + 1);
- foe[a][b] = 1;
- }
- cin >> q;
- vecb not_alone(m + k);
- for (int i = 0; i < q; i++) {
- int a; cin >> a;
- not_alone[--a] = true;
- }
- vecb used1(m);
- for (int i = 0; i < m; i++)
- for (int j = 0; j < k; j++)
- if (p[j] == -1 && !foe[i][j] && (not_alone[i] || not_alone[m + j])) {
- p[j] = i;
- used1[i] = true;
- break;
- }
- for (int i = 0; i < m; i++) {
- if (used1[i]) continue;
- used.assign(m, 0);
- int a = (int)dfs(i);
- }
- list<pi> res;
- int cnt_n = 0;
- for (int i = 0; i < m + k; i++) {
- if (i >= m && p[i - m] != -1)
- cnt_n++;
- if (not_alone[i]) {
- if (i >= m) {
- if (p[i - m] == -1) {
- cout << "NO\n";
- return 0;
- }
- res.eb(p[i - m] + 1, i + 1);
- p[i - m] = -1;
- }
- else {
- int in = find(all(p), i) - p.begin();
- if (in == k) {
- cout << "NO\n";
- return 0;
- }
- res.eb(p[in] + 1, in + 1 + m);
- p[in] = -1;
- }
- }
- }
- if (cnt_n < n) {
- cout << "NO\n";
- return 0;
- }
- cout << "YES\n";
- for (pi i : res) {
- cout << i.x << " " << i.y << "\n";
- n--;
- if (!n)
- break;
- }
- for (int i = 0; i < k && n; i++) {
- if (p[i] != -1) {
- n--;
- cout << p[i] + 1 << " " << m + i + 1 << "\n";
- }
- }
- /*auto end_time = chrono::high_resolution_clock::now();
- chrono::duration<double> duration = end_time - start_time;
- cout << duration.count() << "\n";
- cin.close();
- cout.close();*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment