Problem:
Score : 400 points

Problem Statement

There are N persons called Person 1 through Person N.

You are given M facts that "Person A_i and Person B_i are friends." The same fact may be given multiple times.

If X and Y are friends, and Y and Z are friends, then X and Z are also friends. There is no friendship that cannot be derived from the M given facts.

Takahashi the evil wants to divide the N persons into some number of groups so that every person has no friend in his/her group.

At least how many groups does he need to make?

Constraints

2 \leq N \leq 2\times 10^5

0 \leq M \leq 2\times 10^5

1\leq A_i,B_i\leq N

A_i \neq B_i

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
\vdots
A_M B_M

Output

Print the answer.

Sample Input 1

5 3
1 2
3 4
5 1

Sample Output 1

3

Dividing them into three groups such as \{1,3\}, \{2,4\}, and \{5\} achieves the goal.

Sample Input 2

4 10
1 2
2 1
1 2
2 1
1 2
1 3
1 4
2 3
2 4
3 4

Sample Output 2

4

Sample Input 3

10 4
3 1
4 1
5 9
2 6

Sample Output 3

3

Solution in C++ (GCC 9.2.1) (judge verdict: Time Limit Exceeded)


#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
#define FOR(i,a,b) for(int i=a; i<=b; i++)
#define all(v) v.begin(), v.end()
#define F first
#define S second
#define INF 1000000000000
#define MOD 1000000007
#define PI 3.14159265359
#define dij priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>
typedef long long ll;
//
vector<int> get_friend(vector<vector<int>> v,int n,int k){
  stack<pair<int,int>>st;
  vector<bool> che(n,false);
  che[k]=true;
  vector<int> ans;ans.push_back(k);
  for(auto e:v[k]){
    st.push(make_pair(k,e));
  }
  //che[0]=true;
  while(!st.empty()){
    auto p=st.top();st.pop();
    for(auto e:v[p.S]){
      //if(!che[e]){
        //che[e]=true;
        for(auto f:v[e]){
          if(!che[f]){
            che[f]=true;
            ans.push_back(f);
            st.push(make_pair(e,f));
          }
        }
      //}
    } 
  }
  return ans;
}
int main(){
  int n,m;cin>>n>>m;
  vector<vector<int>> v(n);
  rep(i,m){
    int a,b;cin>>a>>b;
    a--;b--;
    v[a].push_back(b);
    v[b].push_back(a);
  }
  vector<bool> che(n,false);
  //che[0]=true;
  vector<vector<int>> ans;
  //vector<int> vv;
  //vv=get_friend(v,n,0);
  //for(auto e:vv)cout<<e;
  rep(i,n){
    if(!che[i]){
      //cout<<i<<endl;
    vector<int> vv=get_friend(v,n,i);
    for(auto e:vv)che[e]=true;
    ans.push_back(vv);
  }
  }
  //for(auto f:ans){for(auto g:f)cout<<g;cout<<endl;}
  int ma=0;
  for(auto e:ans){
    int a=e.size();
    ma=max(ma,a);
  }
  cout<<ma<<endl;
}