#include #include using namespace std; const int N=1e5+5,M=2e5+5,INF=1e9; int n,m,tot=1,cnt; int head[N],ver[M],Next[M],sz[N],f[N]; bool v[N]; void add(int x,int y){ ver[++tot]=y,Next[tot]=head[x],head[x]=tot; } void dfs(int x){ v[x]=1; sz[cnt]++; for(int i=head[x];i;i=Next[i]){ int y=ver[i]; if(v[y]) continue; dfs(y); } } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; add(x,y); add(y,x); } for(int i=1;i<=n;i++){ if(!v[i]){ cnt++; dfs(i); } f[i]=INF; } sort(sz+1,sz+cnt+1); f[0]=0; for(int i=1,j;i<=cnt;i=j+1){ j=i; while(j=(1<=(1<=rest*sz[i];l--) f[l]=min(f[l],f[l-rest*sz[i]]+rest); break; } } // cout<