Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<algorithm>
- #include<vector>
- #include<set>
- #include<cmath>
- #include<math.h>
- #include<iomanip>
- #include<queue>
- using namespace std;
- #define int ld
- typedef long double ld;
- const int INF = 1e12;
- ld poww(ld a, int b) {
- if (b == 0) {
- return 1;
- }
- if (b - 2 == 0) {
- ld p = poww(a, b / 2);
- return p * p;
- }
- else {
- return a * poww(a, b - 1);
- }
- }
- signed main()
- {
- int t;
- cin >> t;
- for (int q = 0; q < t; ++q) {
- int n, m;
- cin >> n >> m;
- vector < vector < int > > edge(n), rot_ed(n), T(n);
- vector < int > lvl(n), p(n);
- vector < pair < int, int > > start(n);
- for (int i = 0; i < m; ++i) {
- int to, v;
- cin >> to >> v;
- edge[--to].push_back(--v);
- edge[v].push_back(to);
- }
- for (int i = 0; i < n; ++i) start[i] = { edge[i].size(), i };
- sort(start.begin(), start.end());
- reverse(start.begin(), start.end());
- bool check = true;
- set < int > ans;
- ans.insert(start[0].second);
- p[start[0].second] = -1;
- lvl[start[0].second] = 0;
- for (int it = 1; it < n; it++) {
- if (!check) continue;
- int v = start[it].second;
- int Now1 = -1, Now2 = -1;
- for (int i = 0; i < edge[v].size(); ++i) {
- int to = edge[v][i];
- if (ans.find(to) == ans.end()) continue;
- if (Now2 > lvl[to]) {
- continue;
- }
- Now2 = lvl[to];
- Now1 = to;
- }
- if (Now1 == -1) {
- if (check) cout << "No" << endl;
- check = false;
- }
- p[v] = Now1;
- lvl[v] = Now2 + 1;
- ans.insert(v);
- }
- for (int i = 0; i < n; ++i) {
- if (p[i] != -1) {
- T[p[i]].push_back(i);
- }
- }
- int cnt = 0;
- for (int start = 0; start < n; ++start) {
- if (!check) continue;
- queue < int > q;
- q.push(start);
- while (!q.empty()) {
- int v = q.front();
- q.pop();
- for (int i = 0; i < T[v].size(); ++i) {
- int to = T[v][i];
- rot_ed[start].push_back(to);
- rot_ed[to].push_back(start);
- q.push(to);
- cnt++;
- if (cnt > m) {
- if (check) cout << "No" << endl;
- check = false;
- break;
- }
- }
- }
- }
- if (!check) {
- continue;
- }
- for (int i = 0; i < n; ++i) {
- if (edge[i].size() != rot_ed[i].size()) {
- if (check) {
- cout << "No" << endl;
- }
- check = false;
- }
- sort(edge[i].begin(), edge[i].end());
- sort(rot_ed[i].begin(), rot_ed[i].end());
- for (int j = 0; j < edge[i].size(); ++j) {
- if (edge[i][j] != rot_ed[i][j]) {
- if (check) {
- cout << "No" << endl;
- }
- check = false;
- }
- }
- }
- if (!check) {
- continue;
- }
- cout << "Yes" << endl;
- for (int i = 0; i < n; ++i) {
- cout << p[i] + 1 << ' ';
- }
- cout << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement