Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.35 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #include <ext/pb_ds/assoc_container.hpp>
  4. #include <ext/pb_ds/tree_policy.hpp>
  5.  
  6. #pragma GCC optimize("O3")
  7.  
  8. using namespace std;
  9. using namespace __gnu_pbds;
  10.  
  11. #define int long long
  12. #define double long double
  13. #define _ << ' ' <<
  14. #define For(i,z) for(int32_t i=0;i<(z);i++)
  15. #define sqr(a) ((a)*(a))
  16.  
  17. #define pii pair<int, int>
  18. #define f first
  19. #define s second
  20.  
  21. template<typename T>
  22. using orset = tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  23.  
  24. template<typename T, typename K>
  25. using ormap = tree <T, K, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  26.  
  27. template<typename T, typename K> inline void umax(T &a, K b) { a = max(a, (T)b); }
  28. template<typename T, typename K> inline void umin(T &a, K b) { a = min(a, (T)b); }
  29. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  30.  
  31. const int32_t N = 1e5+10;
  32. const int INF = 1e16 + 10;
  33. const pii PINF = make_pair(INF, INF);
  34. const double EPS = 1e-8;
  35. const int II = 1e9 + 10;
  36. const int MOD = 1e9+7;
  37. const int AMOD = 99194853094755497;
  38.  
  39.  
  40. int n, m;
  41. vector<int> inpgr[N];
  42. vector<int> gr[N];
  43. vector<int> rev[N];
  44. int par[N];
  45. bool was[N];
  46.  
  47. int sss;
  48.  
  49. set<pii> used;
  50. void orient(int v) {
  51. was[v] = true;
  52. for (int &i : inpgr[v]) {
  53. if (!was[i]) {
  54. rev[i].push_back(v);
  55. orient(i);
  56. };
  57. }
  58. }
  59.  
  60. bool bad(int v, int p = -1, int dep = 0) {
  61. bool verd = false;
  62. sss += dep;
  63. //cerr << "at " << v << endl;
  64. for (int &i : gr[v])
  65. if (i != p) {
  66. if (was[i]) return false;
  67. par[i] = v;
  68. verd |= bad(i, v, dep + 1);
  69. }
  70. return verd;
  71. }
  72.  
  73. bool revcomp(const int &a, const int &b) {
  74. return (rev[a].size() < rev[b].size());
  75. }
  76.  
  77. int32_t main() {
  78. //freopen("input.txt", "r", stdin);
  79. //freopen("output.txt", "w", stdout);
  80. ios_base::sync_with_stdio(false);
  81. cin.tie(0); cout.tie(0);
  82.  
  83. int t; cin >> t;
  84. while (t--) {
  85. cin >> n >> m;
  86. sss = 0;
  87. For (i, n+10) {
  88. used.clear();
  89. gr[i].clear();
  90. rev[i].clear();
  91. inpgr[i].clear();
  92. was[i] = 0;
  93. par[i] = -1;
  94. }
  95.  
  96. For (i, m) {
  97. int a, b; cin >> a >> b; a--; b--;
  98. inpgr[a].push_back(b);
  99. inpgr[b].push_back(a);
  100. }
  101. int st = 0;
  102. For (i, n)
  103. if (inpgr[st].size() < inpgr[i].size())
  104. st = i;
  105. orient(st);
  106.  
  107. vector <int> idxs(n);
  108. For (i, n) idxs[i] = i;
  109. sort(idxs.begin(), idxs.end(), revcomp);
  110. for (int &i : idxs){
  111. sort(rev[i].begin(), rev[i].end(), revcomp);
  112. int ws = i;
  113. for (int &j : rev[i]) {
  114. pii z = make_pair(ws, j);
  115. if (!used.count(z)) {
  116. gr[j].push_back(ws);
  117. gr[ws].push_back(j);
  118. used.insert(z);
  119. used.insert({z.s, z.f});
  120. }
  121. ws = j;
  122. }
  123. }
  124. For (i, n) was[i] = 0;
  125. if (used.size() == 2 * n - 2 && bad(st) == false && sss == m) {
  126. cout << "Yes\n";
  127. For (i, n)
  128. cout << par[i] + 1 << ' ';
  129. cout << '\n';
  130. } else
  131. cout << "No\n";
  132. }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement