1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include<bits/stdc++.h>
using namespace std;
struct node { int u,v; }a[1005]; int head[1005]; int tot;
int dep[1005],chd[1006],par[1005]; int cnd[1005]; int cnt[1005][1005]; bool vis[1005];
void add(int u,int v) { a[++tot].u=head[u]; head[u]=tot; a[tot].v=v; }
void getc(int u,int f,int d) { dep[u]=d; chd[u]=1; par[u]=f; for(int i=head[u];i;i=a[i].u) { int v=a[i].v; if(v==f) { continue; } getc(v,u,d+1); chd[u]+=chd[v]; } }
void dfs(int u,bool f) { for(int i=head[u];i;i=a[i].u) { int v=a[i].v; vis[v]=f; if(v==par[u]) { continue; } dfs(v,f); } }
int ans,ans1;
void solve(int d) { for(int i=1;i<=cnd[d];i++) { if(vis[par[cnt[d][i]]]==1) { continue; } dfs(cnt[d][i],1); ans+=chd[cnt[d][i]]; solve(d+1); ans-=chd[cnt[d][i]]; dfs(cnt[d][i],0);
} ans1=max(ans,ans1); }
int n,p;
int main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0);
cin>>n>>p;
for(int i=1;i<=p;i++) { int u,v; cin>>u>>v; add(u,v),add(v,u); }
getc(1,0,1); for(int i=1;i<=n;i++) { cnt[dep[i]][++cnd[dep[i]]]=i; } solve(2); cout<<n-ans1<<"\n";
return 0; }
|