Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <bitset>
- #include <algorithm>
- #include <queue>
- #include <stack>
- #include <set>
- #include <math.h>
- #include <cstring>
- #include <sstream>
- std::vector<int> mt;
- std::vector<bool> used;
- int main(){
- std::ios_base::sync_with_stdio(false);
- std::cin.tie(0); std::cout.tie(0);
- int n, m;
- std::cin >> m >> n;
- std::vector<std::vector<int>> g = std::vector<std::vector<int>>(m);
- for(int i =0; i < m; i++) {
- int v_num;
- std::cin >> v_num;
- for(int j=0; j < v_num; j++) {
- int v;
- std::cin >> v;
- g[i].push_back(v-1);
- }
- }
- //matching i from L to mt[i] from R
- mt.assign(m,-1);
- for(int i=0; i < m; i++) {
- int v;
- std::cin >> v;
- mt[i] = v-1;
- }
- std::vector<bool>free = std::vector<bool>(m,true);
- for (int i=0; i < m; i++) {
- if (mt[i] != -1) {
- free[i] = false;
- }
- }
- //2nd half is L 1st is R
- std::vector<std::vector<int>> g2 = std::vector<std::vector<int>>(n+m);
- for(int i = 0; i < m; i++) {
- for(auto u : g[i]) {
- if(mt[i] == u) {
- g2[u+m].push_back(i);
- }
- else {
- g2[i].push_back(u+m);
- }
- }
- }
- std::vector<bool>used2 = std::vector<bool>(n+m,false);
- for(int i = 0; i < m; i++) {
- if(free[i] && !used2[i]) {
- dfs(i,g2,used2);
- }
- }
- std::vector<int> l_minus;
- std::vector<int> r_plus;
- for(int i=0; i< m; i++) {
- if(!used2[i]) l_minus.push_back(i);
- }
- for(int i=m; i< m+n; i++) {
- if(used2[i]) r_plus.push_back(i-m);
- }
- std::cout << l_minus.size() + r_plus.size();
- std::sort(l_minus.begin(),l_minus.end());
- std::sort(r_plus.begin(),r_plus.end());
- std::cout << "\n" << l_minus.size() << " ";
- for(auto v: l_minus) {
- std::cout << v+1 << " ";
- }
- std::cout <<"\n" <<r_plus.size() << " ";
- for(auto v: r_plus) {
- std::cout << v+1 << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement