Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <utility>
- using namespace std;
- void mb(const vector<vector<int>>& edges,int pt,vector<int>& enter,vector<int>& leave,int lv,vector<int>&back,vector<int>&parent){
- enter[pt]=lv;
- back[pt]=pt;
- for (int x:edges[pt]){
- if (enter[x]!=-1){
- if (enter[back[pt]]>enter[x]&&x!=parent[pt]){
- back[pt]=x;
- }
- }else{
- parent[x]=pt;
- mb(edges,x,enter,leave,lv+1,back,parent);
- if (enter[back[pt]]>enter[back[x]]){
- back[pt]=back[x];
- }
- lv=leave[x];
- }
- }
- leave[pt]=lv+1;
- }
- 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){
- int parts=1;
- int mindartsize=0;//inf
- int sumsize=0;
- for (int x:edges[pt]){
- if (parent[x]==pt&&enter[back[x]]>=enter[pt]){
- ++parts;
- sumsize+=(leave[x]-enter[x]+1)/2;
- mindartsize=max(mindartsize,(leave[x]-enter[x]+1)/2);
- }
- }
- if (pt==0)
- return pair<int,int>(parts-1,-mindartsize);
- mindartsize=max(mindartsize,N-sumsize-1);
- return pair<int,int>(parts,-mindartsize);
- }
- int main(){
- ios::sync_with_stdio(0);
- int N,M;
- cin>>N>>M;
- vector<vector<int>> edges(N);
- for (int i=0; i!=M;++i){
- int a,b;
- cin>>a>>b;
- --a;--b;
- edges[a].push_back(b);
- edges[b].push_back(a);
- }
- vector<int> enter(N,-1),leave(N,-1),back(N),parent(N);
- //for (int i=0; i!=N;++i) if (enter[i]==-1)
- mb(edges,0,enter,leave,0,back,parent);
- int rplace;
- pair<int,int> res;res.first=-N*10;
- for (int i=0; i!=N;++i){
- auto x=cutpoint(edges,i,enter,leave,N,back,parent);
- if (res<x) {res=x; rplace=i;};
- }
- cout<<rplace+1<<"\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement