Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<set>
  5. #include<cmath>
  6. #include<math.h>
  7. #include<iomanip>
  8. #include<queue>
  9. using namespace std;
  10. #define int ld
  11. typedef long double ld;
  12. const int INF = 1e12;
  13. ld poww(ld a, int b) {
  14.     if (b == 0) {
  15.         return 1;
  16.     }
  17.     if (b - 2 == 0) {
  18.         ld p = poww(a, b / 2);
  19.         return p * p;
  20.     }
  21.     else {
  22.         return a * poww(a, b - 1);
  23.     }
  24. }
  25. signed main()
  26. {
  27.     int t;
  28.     cin >> t;
  29.     for (int q = 0; q < t; ++q) {
  30.         int n, m;
  31.         cin >> n >> m;
  32.         vector < vector < int > > edge(n), rot_ed(n), T(n);
  33.         vector < int > lvl(n), p(n);
  34.         vector < pair < int, int > > start(n);
  35.         for (int i = 0; i < m; ++i) {
  36.             int to, v;
  37.             cin >> to >> v;
  38.             edge[--to].push_back(--v);
  39.             edge[v].push_back(to);
  40.         }
  41.         for (int i = 0; i < n; ++i) start[i] = { edge[i].size(), i };
  42.         sort(start.begin(), start.end());
  43.         reverse(start.begin(), start.end());
  44.         bool check = true;
  45.         set < int > ans;
  46.         ans.insert(start[0].second);
  47.         p[start[0].second] = -1;
  48.         lvl[start[0].second] = 0;
  49.         for (int it = 1; it < n; it++) {
  50.             if (!check) continue;
  51.             int v = start[it].second;
  52.             int Now1 = -1, Now2 = -1;
  53.             for (int i = 0; i < edge[v].size(); ++i) {
  54.                 int to = edge[v][i];
  55.                 if (ans.find(to) == ans.end()) continue;
  56.                 if (Now2 > lvl[to]) {
  57.                     continue;
  58.                 }
  59.                 Now2 = lvl[to];
  60.                 Now1 = to;
  61.             }
  62.             if (Now1 == -1) {
  63.                 if (check) cout << "No" << endl;
  64.                 check = false;
  65.             }
  66.             p[v] = Now1;
  67.             lvl[v] = Now2 + 1;
  68.             ans.insert(v);
  69.         }
  70.         for (int i = 0; i < n; ++i) {
  71.             if (p[i] != -1) {
  72.                 T[p[i]].push_back(i);
  73.             }
  74.         }
  75.         int cnt = 0;
  76.         for (int start = 0; start < n; ++start) {
  77.             if (!check) continue;
  78.             queue < int > q;
  79.             q.push(start);
  80.             while (!q.empty()) {
  81.                 int v = q.front();
  82.                 q.pop();
  83.                 for (int i = 0; i < T[v].size(); ++i) {
  84.                     int to = T[v][i];
  85.                     rot_ed[start].push_back(to);
  86.                     rot_ed[to].push_back(start);
  87.                     q.push(to);
  88.                     cnt++;
  89.                     if (cnt > m) {
  90.                         if (check) cout << "No" << endl;
  91.                         check = false;
  92.                         break;
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.         if (!check) {
  98.             continue;
  99.         }
  100.       for (int i = 0; i < n; ++i) {
  101.             if (edge[i].size() != rot_ed[i].size()) {
  102.                 if (check) {
  103.                     cout << "No" << endl;
  104.                 }
  105.                 check = false;
  106.             }
  107.             sort(edge[i].begin(), edge[i].end());
  108.             sort(rot_ed[i].begin(), rot_ed[i].end());
  109.             for (int j = 0; j < edge[i].size(); ++j) {
  110.                 if (edge[i][j] != rot_ed[i][j]) {
  111.                     if (check) {
  112.                         cout << "No" << endl;
  113.                     }
  114.                     check = false;
  115.                 }
  116.             }
  117.         }
  118.       if (!check) {
  119.           continue;
  120.       }
  121.         cout << "Yes" << endl;
  122.         for (int i = 0; i < n; ++i) {
  123.             cout << p[i] + 1 << ' ';
  124.         }
  125.         cout << endl;
  126.     }
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement