Advertisement
pratiyush7

Endpoints of a Diameter

Nov 11th, 2021
503
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. vector<int> solve(int N, vector<vector<int> > edge) {
  2.     int deg[N + 1];
  3.     memset(deg, 0, sizeof(deg));
  4.     int alive = N;
  5.     vector<vector<int> > ed(N + 1);
  6.     queue<int> q;
  7.     for(int i = 0; i < N - 1; i++) {
  8.         int a = edge[i][0], b = edge[i][1];
  9.         ed[a].push_back(b);
  10.         ed[b].push_back(a);
  11.         deg[a]++;
  12.         deg[b]++;
  13.     }
  14.     for(int i = 1; i <= N; i++)
  15.         if(deg[i] == 1)
  16.             q.push(i);
  17.     while(alive > 2) {
  18.         queue<int> next;
  19.         while(!q.empty()) {
  20.             int now = q.front();
  21.             assert(deg[now] == 1);
  22.             q.pop();
  23.             deg[now] = -1;
  24.             alive--;
  25.             for(int i = 0; i < ed[now].size(); i++) {
  26.                     deg[ed[now][i]]--;
  27.                     if(deg[ed[now][i]] == 1)
  28.                         next.push(ed[now][i]);
  29.             }
  30.         }
  31.         q = next;
  32.     }
  33.     vector<int> sus;
  34.     for(int i = 1; i <= N; i++)
  35.         if(deg[i] > -1)
  36.             sus.push_back(i);
  37.     assert(sus.size() == alive);
  38.     vector<int> ans(N, 0);
  39.     for(int i = 0; i < alive; i++) {
  40.         int st = sus[i];
  41.         queue<int> bfs;
  42.         int dis[N + 1];
  43.         memset(dis, -1, sizeof(dis));
  44.         dis[st] = 0;
  45.         bfs.push(st);
  46.         int mx = 0;
  47.         while(!bfs.empty()) {
  48.             int now = bfs.front();
  49.             bfs.pop();
  50.             mx = max(dis[now], mx);
  51.             for(int i = 0; i < ed[now].size(); i++) {
  52.                 if(dis[ed[now][i]] > -1) continue;
  53.                 dis[ed[now][i]] = dis[now] + 1;
  54.                 bfs.push(ed[now][i]);
  55.             }
  56.         }
  57.         for(int i = 1; i <= N; i++)
  58.             if(dis[i] == mx)
  59.                 ans[i - 1] = 1;
  60.     }
  61.     return ans;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement