During an Animal Day event, N people (numbered from 0 to N−1) showed up. Each of them had either a dog or a cat. The organizers decided to give them a wonderful gift: a toy for each animal.
After the event, it turned out that some people who owned a dog had received a cat-toy, and some people who owned a cat received a dog-toy. People may exchange toys, but only if they know each other (otherwise they have no way to contact the other person). The pair of people can exchange toys multiple times.
Knowing who knows who, who owns which animal, and what kind of toy he or she received, can you determine whether it is possible for people to exchange toys in such a way that every dog ends up with a dog-toy and every cat gets a cat-toy?
Write a function:
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B);
that returns true if it is possible to exchange toys in such a way that every animal receives an appropriate toy, or false otherwise. First two arrays describe the pets (array P) and toys (array T) that every person owns. The J-th person owns pet P[J] and toy T[J] (1 means dog or dog-toy and 2 means cat or cat-toy). The next two arrays, A and B, both of length M, describe the relationships between people. For each integer K from 0 to M−1, person A[K] knows person B[K].
Examples:
1. Given:
P = [1, 1, 2] T = [2, 1, 1] A = [0, 2] B = [1, 1]the function should return true. Person 0 can exchange toys with person 1 to obtain a dog-toy, and then person 1 can exchange toys with person 2.
2. Given:
P = [2, 2, 1, 1, 1] T = [1, 1, 1, 2, 2] A = [0, 1, 2, 3] B = [1, 2, 0, 4]the function should return false. There is no way for persons 3 and 4 to exchange toys with others.
3. Given:
P = [1, 1, 2, 2, 1, 1, 2, 2] T = [1, 1, 1, 1, 2, 2, 2, 2] A = [0, 2, 4, 6] B = [1, 3, 5, 7]the function should return false. There is no way for persons 2 and 3 and for persons 4 and 5 to exchange toys with others.
4. Given:
P = [2, 2, 2, 2, 1, 1, 1, 1] T = [1, 1, 1, 1, 2, 2, 2, 2] A = [0, 1, 2, 3, 4, 5, 6] B = [1, 2, 3, 4, 5, 6, 7]the function should return true.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..100,000];
- M is an integer within the range [0..200,000];
- each element of arrays P and T is an integer that can have one of the following values: 1, 2;
- each element of arrays A and B is an integer within the range [0..N-1];
- for each integer K from 0 to M−1, elements A[K] and B[K] are different;
- there are no redundant elements in arrays A, B; more formally every unordered pair of persons a, b will appear as A[K], B[K] for at most one K.
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n =
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
que
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
queue<int> q;
q.push()
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
dog_toy += T
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
dog_toy += T[i] == 1;
cat += P[i] == 2;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u =
}
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
dog_toy += T[i] == 1;
cat += P[i] == 2;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
dog
}
}
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
}
}
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
u.push()
}
}
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
u.push()
}
}
}
}
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
u.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
func.cpp: In function 'bool solution(std::vector<int>&, std::vector<int>&, std::vector<int>&, std::vector<int>&)': func.cpp:20:9: error: 'queue' was not declared in this scope queue<int> q; ^~~~~ func.cpp:20:15: error: expected primary-expression before 'int' queue<int> q; ^~~ func.cpp:21:9: error: 'q' was not declared in this scope q.push(i); ^ func.cpp:35:19: error: request for member 'push' in 'u', which is of non-class type 'int' u.push(v); ^~~~
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
u.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
func.cpp: In function 'bool solution(std::vector<int>&, std::vector<int>&, std::vector<int>&, std::vector<int>&)': func.cpp:36:19: error: request for member 'push' in 'u', which is of non-class type 'int' u.push(v); ^~~~
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
q.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
q.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
visited[v] = true;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
q.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
// dog += P[i] == 1;
// cat += P[i] == 2;
// dog_toy += T[i] == 1;
// cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
visited[v] = true;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
q.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
// dog += P[i] == 1;
// cat += P[i] == 2;
// dog_toy += T[i] == 1;
// cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
visited[v] = true;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
q.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
visited[i] = true;
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
visited[v] = true;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
q.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
visited[i] = true;
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
visited[v] = true;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
q.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
bool solution(vector<int> &P, vector<int> &T, vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
int n = P.size(), m = A.size();
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
adj[A[i]].push_back(B[i]);
adj[B[i]].push_back(A[i]);
}
vector<bool> visited(n);
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
int dog = 0, dog_toy = 0, cat = 0, cat_toy = 0;
queue<int> q;
q.push(i);
visited[i] = true;
dog += P[i] == 1;
cat += P[i] == 2;
dog_toy += T[i] == 1;
cat_toy += T[i] == 2;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : adj[u]) {
if (visited[v]) continue;
visited[v] = true;
dog += P[v] == 1;
cat += P[v] == 2;
dog_toy += T[v] == 1;
cat_toy += T[v] == 2;
q.push(v);
}
}
if (cat != cat_toy || dog != dog_toy) return false;
}
return true;
}
The solution obtained perfect score.