Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vector<int> solve(int N, vector<vector<int> > edge) {
- int deg[N + 1];
- memset(deg, 0, sizeof(deg));
- int alive = N;
- vector<vector<int> > ed(N + 1);
- queue<int> q;
- for(int i = 0; i < N - 1; i++) {
- int a = edge[i][0], b = edge[i][1];
- ed[a].push_back(b);
- ed[b].push_back(a);
- deg[a]++;
- deg[b]++;
- }
- for(int i = 1; i <= N; i++)
- if(deg[i] == 1)
- q.push(i);
- while(alive > 2) {
- queue<int> next;
- while(!q.empty()) {
- int now = q.front();
- assert(deg[now] == 1);
- q.pop();
- deg[now] = -1;
- alive--;
- for(int i = 0; i < ed[now].size(); i++) {
- deg[ed[now][i]]--;
- if(deg[ed[now][i]] == 1)
- next.push(ed[now][i]);
- }
- }
- q = next;
- }
- vector<int> sus;
- for(int i = 1; i <= N; i++)
- if(deg[i] > -1)
- sus.push_back(i);
- assert(sus.size() == alive);
- vector<int> ans(N, 0);
- for(int i = 0; i < alive; i++) {
- int st = sus[i];
- queue<int> bfs;
- int dis[N + 1];
- memset(dis, -1, sizeof(dis));
- dis[st] = 0;
- bfs.push(st);
- int mx = 0;
- while(!bfs.empty()) {
- int now = bfs.front();
- bfs.pop();
- mx = max(dis[now], mx);
- for(int i = 0; i < ed[now].size(); i++) {
- if(dis[ed[now][i]] > -1) continue;
- dis[ed[now][i]] = dis[now] + 1;
- bfs.push(ed[now][i]);
- }
- }
- for(int i = 1; i <= N; i++)
- if(dis[i] == mx)
- ans[i - 1] = 1;
- }
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement