Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. #define ok puts("OK");
  5.  
  6. using namespace std;
  7.  
  8. const int N = (int)3e5 + 7;
  9.  
  10. int par[N], sz[N];
  11. int ans[N];
  12.  
  13. int getpar(int a) {
  14.   if (par[a] == a) return a;
  15.   return par[a] = getpar(par[a]);
  16. }
  17.  
  18. void connect(int a, int b) {
  19.   a = getpar(a);
  20.   b = getpar(b);
  21.   if (a != b) {
  22.     if (sz[a] > sz[b]) swap(a, b);
  23.     par[a] = b;
  24.     sz[b] += sz[a];
  25.   }
  26. }
  27.  
  28. vector <int> gr[N], ngr[N];
  29. int n, m;
  30. int pos[N], used[N];
  31. vector <int> order;
  32.  
  33. void finish() {
  34.   puts("NO");
  35.   exit(0);
  36. }
  37.  
  38. void dfs(int v, int pr) {
  39.   used[v] = 1;
  40.   for (int to : ngr[v]) {
  41.     if (to == v || to == pr) continue;
  42.     if (used[to] == 1) {
  43.       finish();
  44.     } else if (used[to] == 2) {
  45.       continue;
  46.     }
  47.     dfs(to, v);
  48.   }
  49.   used[v] = 2;
  50.   order.push_back(v);
  51. }
  52.  
  53. main() {
  54.   iota(par, par + N, 0);
  55.   fill(sz, sz + N, 1);
  56.   iota(pos, pos + N, 0);
  57.   scanf("%d %d", &n, &m);
  58.   for (int i = 1, u, v; i <= m; i++) {
  59.     scanf("%d %d", &u, &v);
  60.     gr[u].push_back(v);
  61.     gr[v].push_back(u);
  62.   }
  63.   for (int i = 1; i <= n; i++) {
  64.     gr[i].push_back(i);
  65.     sort(gr[i].begin(), gr[i].end());
  66.   }
  67.   sort(pos + 1, pos + n + 1, [&](const int &A, const int &B) {
  68.     return gr[A] < gr[B];
  69.   });
  70.   for (int i = 2; i <= n; i++) {
  71.     if (gr[pos[i]] == gr[pos[i - 1]])
  72.       connect(pos[i - 1], pos[i]);
  73.   }
  74.   for (int i = 1; i <= n; i++) {
  75.     if (i != getpar(i)) continue;
  76.     for (int to : gr[i]) {
  77.       if (i != getpar(to)) {
  78.         ngr[i].push_back(getpar(to));
  79.       }
  80.     }
  81.     sort(ngr[i].begin(), ngr[i].end());
  82.     ngr[i].resize(unique(ngr[i].begin(), ngr[i].end()) - ngr[i].begin());
  83.   }
  84.   int st = -1;
  85.   for (int i = 1; i <= n; i++) {
  86.     if (ngr[i].size() <= 1 && i == getpar(i)) st = i;
  87.   }
  88.   if (st == -1)
  89.     finish();
  90.   dfs(st, st);
  91.   for (int i = 1; i <= n; i++) {
  92.     if (i != getpar(i)) continue;
  93.     if (ngr[i].size() > 2)
  94.       finish();
  95.   }
  96.   int cur = 1;
  97.   for (int to : order) {
  98.     ans[to] = cur++;
  99.   }
  100.   puts("YES");
  101.   for (int i = 1; i <= n; i++) {
  102.     printf("%d ", ans[getpar(i)]);
  103.   }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement