Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- #pragma GCC optimize("O3")
- using namespace std;
- using namespace __gnu_pbds;
- #define int long long
- #define double long double
- #define _ << ' ' <<
- #define For(i,z) for(int32_t i=0;i<(z);i++)
- #define sqr(a) ((a)*(a))
- #define pii pair<int, int>
- #define f first
- #define s second
- template<typename T>
- using orset = tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- template<typename T, typename K>
- using ormap = tree <T, K, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- template<typename T, typename K> inline void umax(T &a, K b) { a = max(a, (T)b); }
- template<typename T, typename K> inline void umin(T &a, K b) { a = min(a, (T)b); }
- mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
- const int32_t N = 1e5+10;
- const int INF = 1e16 + 10;
- const pii PINF = make_pair(INF, INF);
- const double EPS = 1e-8;
- const int II = 1e9 + 10;
- const int MOD = 1e9+7;
- const int AMOD = 99194853094755497;
- int n, m;
- vector<int> inpgr[N];
- vector<int> gr[N];
- vector<int> rev[N];
- int par[N];
- bool was[N];
- int sss;
- set<pii> used;
- void orient(int v) {
- was[v] = true;
- for (int &i : inpgr[v]) {
- if (!was[i]) {
- rev[i].push_back(v);
- orient(i);
- };
- }
- }
- bool bad(int v, int p = -1, int dep = 0) {
- bool verd = false;
- sss += dep;
- //cerr << "at " << v << endl;
- for (int &i : gr[v])
- if (i != p) {
- if (was[i]) return false;
- par[i] = v;
- verd |= bad(i, v, dep + 1);
- }
- return verd;
- }
- bool revcomp(const int &a, const int &b) {
- return (rev[a].size() < rev[b].size());
- }
- int32_t main() {
- //freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- ios_base::sync_with_stdio(false);
- cin.tie(0); cout.tie(0);
- int t; cin >> t;
- while (t--) {
- cin >> n >> m;
- sss = 0;
- For (i, n+10) {
- used.clear();
- gr[i].clear();
- rev[i].clear();
- inpgr[i].clear();
- was[i] = 0;
- par[i] = -1;
- }
- For (i, m) {
- int a, b; cin >> a >> b; a--; b--;
- inpgr[a].push_back(b);
- inpgr[b].push_back(a);
- }
- int st = 0;
- For (i, n)
- if (inpgr[st].size() < inpgr[i].size())
- st = i;
- orient(st);
- vector <int> idxs(n);
- For (i, n) idxs[i] = i;
- sort(idxs.begin(), idxs.end(), revcomp);
- for (int &i : idxs){
- sort(rev[i].begin(), rev[i].end(), revcomp);
- int ws = i;
- for (int &j : rev[i]) {
- pii z = make_pair(ws, j);
- if (!used.count(z)) {
- gr[j].push_back(ws);
- gr[ws].push_back(j);
- used.insert(z);
- used.insert({z.s, z.f});
- }
- ws = j;
- }
- }
- For (i, n) was[i] = 0;
- if (used.size() == 2 * n - 2 && bad(st) == false && sss == m) {
- cout << "Yes\n";
- For (i, n)
- cout << par[i] + 1 << ' ';
- cout << '\n';
- } else
- cout << "No\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement