Advertisement
pb_jiang

LC2493 WA

Dec 4th, 2022
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. class Solution {
  2.     vector<int> vis;
  3.     vector<int> color;
  4.     // int nn;
  5.     vector<int> g[501];
  6.     bool check_odd_ring(int u, int c) {
  7.         if (color[u] && color[u] != c) {
  8.             return false;
  9.         }
  10.         color[u] = c;
  11.         vis[u] = 1;
  12.         for (auto v: g[u]) {
  13.             if (vis[v] == 0) {
  14.                 check_odd_ring(v, c * -1);
  15.             } else if (color[v] != c * -1) {
  16.                 return false;
  17.             }
  18.         }
  19.         return true;
  20.     }
  21.     int bfs(int u) {
  22.         set<int> vv;
  23.         using pii = pair<int, int>;
  24.         queue<pii> q;
  25.         q.push({u, 1});
  26.         int h = 1;
  27.         while(q.empty() == false) {
  28.             auto x = q.front(); q.pop();
  29.             if (vv.count(x.first)) continue;
  30.             h = max(x.second, h);
  31.             vv.insert(x.first);
  32.             for (auto v: g[x.first]) {
  33.                 if (vv.count(v) == 0) {
  34.                     q.push({v, x.second + 1});
  35.                 }
  36.             }
  37.         }
  38.         return h;      
  39.     }
  40.     int height(int u) {
  41.         using pii = pair<int, int>;
  42.         queue<pii> q;
  43.         q.push({u, 1});
  44.         vector<int> nodes;
  45.         int h = 1;
  46.         while(q.empty() == false) {
  47.             auto x = q.front(); q.pop();
  48.             if (vis[x.first]) continue;
  49.             h = max(x.second, h);
  50.             nodes.push_back(x.second);
  51.             vis[x.first] = 1;
  52.             for (auto v: g[x.first]) {
  53.                 if (vis[v] == 0) {
  54.                     q.push({v, x.second + 1});
  55.                 }
  56.             }
  57.         }
  58.         for (auto x: nodes) {
  59.             h = max(h, bfs(x));
  60.         }
  61.         return h;
  62.     }
  63. public:
  64.     int magnificentSets(int n, vector<vector<int>>& edges) {
  65.         for (const auto& e: edges) {
  66.             auto u = e[0], v = e[1];
  67.             g[u].push_back(v);
  68.             g[v].push_back(u);
  69.         }
  70.         vis = vector<int>(n + 1);
  71.         color = vector<int>(n + 1);
  72.         for (int i = 1; i <= n; ++i) {
  73.             if (vis[i] == 0 && check_odd_ring(i, 1) == false)
  74.                 return -1;
  75.         }
  76.         // nn = n;
  77.         int ans = 0;
  78.         vis = vector<int>(n + 1);
  79.         for (int i = 1; i <= n; ++i) {
  80.             if (vis[i] == 0) {
  81.                 ans += height(i);
  82.             }
  83.         }
  84.         return ans;
  85.     }
  86. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement