不是求调代码,我知道也没人帮我调。
只是感受到了没有代码能力的绝望。
心态有点崩,本来打算把预处理调出来后整一波正解的,结果直接爆蛋,保底分都没拿到。
被自己菜哭了。
#include<bits/stdc++.h>
//#define int ll
#define pb push_back
#define mp make_pair
#define sec second
#define fir first
#define pii pair<int,int>
#define piii pair<int,pair<int,int> >
using namespace std;
typedef long long ll;
const int N=1000005;
const int NS=1005;
const int inf=(1<<30)-1;
const ll inff=1ll<<60;
const int mod=1e9+7;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int n,k;
int R,len,mx;
int tot,vec[N];
int top,stc[N];
int vis[N],cir[N],dep[N];
int c[N],p;
int sx[N],ans;
struct Altale{
int x,y;
}a[N];
bool cmp(Altale a,Altale b){
return a.y>b.y;
}
bool cmp2(Altale a,Altale b){
return a.x>b.x;
}
int cnt;
struct Edge{
int from,to,nxt;
}e[N<<1];
int head[N],edcnt;
void add(int u,int v){
e[++edcnt].from=u;
e[edcnt].to=v;
e[edcnt].nxt=head[u];
head[u]=edcnt;
}
void dfs(int u,int fa,int anc){
// printf("%d %d %d\n",u,fa,anc);
vis[u]=1;
vec[++tot]=u;
stc[++top]=u;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa || (v!=anc&&vis[v])) continue;
if(v==anc){
// printf("%d %d %d\n",u,v,fa);
R=1;
len=dep[u];
for(int j=1;j<=len;j++) cir[stc[top]]=1,top--;
continue;
}
dep[v]=dep[u]+1;
dfs(v,u,anc);
}
top--;
}
void dfs2(int u,int fa,int now){
// printf("%d %d %d\n",u,fa,now);
mx=max(mx,now);
vis[u]=2;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(cir[v] || vis[v]==2) continue;
dfs2(v,u,now+1);
}
}
void expand(int u){
dep[u]=1; vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(vis[v]){
continue;
}
R=len=tot=0;
dep[v]=2;
top=1; stc[1]=u;
dfs(v,u,u);
if(R){
mx=0;
for(int j=1;j<=tot;j++)
if(!cir[vec[j]] && vis[vec[j]]!=2)
dfs2(vec[j],-1,1);
a[++cnt].x = mx , a[cnt].y = tot;
}
else a[++cnt].x = tot , a[cnt].y = tot;
}
}
void solve(){
sort(a+1,a+n+1,cmp2);
for(int i=1;i<=n;i++){
sx[i]=sx[i-1]+a[i].x;
if(sx[i]>=k){
ans=min(ans,i);
break;
}
}
sort(a+1,a+cnt+1,cmp);
for(int i=1;i<=cnt;i++) sx[i]=sx[i-1]+a[i].x;
ans=inf;
for(int i=1;i<=cnt;i++){
int now = sx[i-1]+a[i].y;
if(now>=k){
ans=min(ans,i+1);
continue;
}
int res=i+1;
p=0;
for(int j=1;j<i;j++)
c[++p]=a[j].y-a[j].x;
for(int j=i+1;j<=cnt;j++)
c[++p]=a[j].x;
sort(c+1,c+p+1);
for(int j=p;j;j--){
now += c[j];
res++;
if(res>=ans) break;
if(now>=k){
ans=res;
break;
}
}
}
printf("%d\n",ans);
}
int main(){int tests=1;//tests=read();
while(tests--){
n=read(),k=read();
for(int i=1;i<=n;i++){
int u=read(),v=read();
add(u,v); add(v,u);
}
for(int i=1;i<=n;i++){
if(!vis[i]){
if(f[i]!=i) while(1);
expand(i);
}
}
// printf("cnt:%d\n",cnt);
// for(int i=1;i<=cnt;i++) printf("1:%d 2:%d\n",a[i].x,a[i].y);
solve();
} return 0;
}
/*
6 3
1 3
2 3
2 5
3 4
4 5
4 6
17 9
1 2
1 6
1 3
3 4
4 5
5 6
6 7
16 10
10 9
10 11
11 12
11 13
13 14
14 16
15 13
8 16
8 17
*/