Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <utility>
  4. using namespace std;
  5.  
  6. void mb(const vector<vector<int>>& edges,int pt,vector<int>& enter,vector<int>& leave,int lv,vector<int>&back,vector<int>&parent){
  7.     enter[pt]=lv;
  8.     back[pt]=pt;
  9.     for (int x:edges[pt]){
  10.         if (enter[x]!=-1){
  11.             if (enter[back[pt]]>enter[x]&&x!=parent[pt]){
  12.                 back[pt]=x;
  13.             }
  14.         }else{
  15.             parent[x]=pt;
  16.         mb(edges,x,enter,leave,lv+1,back,parent);
  17.         if (enter[back[pt]]>enter[back[x]]){
  18.             back[pt]=back[x];
  19.         }
  20.         lv=leave[x];
  21.         }
  22.     }
  23.     leave[pt]=lv+1;
  24. }
  25.  
  26. pair<int,int> cutpoint(const vector<vector<int>>& edges,int pt,const vector<int>& enter,vector<int>& leave,int N,const vector<int>&back,const vector<int>& parent){
  27.     int parts=1;
  28.     int mindartsize=0;//inf
  29.     int sumsize=0;
  30.     for (int x:edges[pt]){
  31.         if (parent[x]==pt&&enter[back[x]]>=enter[pt]){
  32.             ++parts;
  33.             sumsize+=(leave[x]-enter[x]+1)/2;
  34.             mindartsize=max(mindartsize,(leave[x]-enter[x]+1)/2);
  35.         }
  36.     }
  37.     if (pt==0)
  38.         return pair<int,int>(parts-1,-mindartsize);
  39.     mindartsize=max(mindartsize,N-sumsize-1);
  40.     return pair<int,int>(parts,-mindartsize);
  41. }
  42.  
  43. int main(){
  44.     ios::sync_with_stdio(0);
  45.     int N,M;
  46.     cin>>N>>M;
  47.     vector<vector<int>> edges(N);
  48.     for (int i=0; i!=M;++i){
  49.         int a,b;
  50.         cin>>a>>b;
  51.         --a;--b;
  52.         edges[a].push_back(b);
  53.         edges[b].push_back(a);
  54.     }
  55.     vector<int> enter(N,-1),leave(N,-1),back(N),parent(N);
  56.     //for (int i=0; i!=N;++i) if (enter[i]==-1)
  57.     mb(edges,0,enter,leave,0,back,parent);
  58.     int rplace;
  59.     pair<int,int> res;res.first=-N*10;
  60.     for (int i=0; i!=N;++i){
  61.         auto x=cutpoint(edges,i,enter,leave,N,back,parent);
  62.         if (res<x) {res=x; rplace=i;};
  63.     }
  64.     cout<<rplace+1<<"\n";
  65.  
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement