Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <iterator>
- using namespace std;
- vector <set<int>> gr(100000);
- int mark[100000];
- bool flag = 0;
- void lol(int v)
- {
- for (int i : gr[v])
- {
- if (mark[i] == 1)
- {
- flag = 1;
- return;
- }
- }
- }
- void obxod(int v)
- {
- int k = 1;
- if (mark[v] == 1)
- {
- k = 2;
- }
- for (int i : gr[v])
- {
- if (mark[i] != k && mark[i] > 0)
- {
- flag = 1;
- return;
- }
- if (mark[i] == 0)
- {
- mark[i] = k;
- obxod(i);
- }
- }
- return;
- }
- signed main()
- {
- int n, m;
- cin >> n >> m;
- int s, f;
- // заполнение списка смежности
- for (int i = 0; i < m; i++)
- {
- cin >> s >> f;
- gr[s].insert(f);
- gr[f].insert(s);
- }
- // проверка на двудольность графа
- // никакие две соединенные друг с другом вершины не должны быть помечены разными числами. если все же есть такие, то ответ ноу,
- // иначе ес
- for (int i = 1; i <= n; i++)
- {
- if (mark[i] == 0)
- {
- mark[i] = 1;
- obxod(i);
- if (flag == 1)
- {
- cout << "NO";
- return 0;
- }
- }
- }
- cout << "YES" << endl;
- for (int i = 1; i <= n; i++)
- {
- if (mark[i] == 2)
- {
- cout << i << " ";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement