代码如下:跑得最慢的点用了 189ms
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
int num1[305],num2[305],sum[305],vis[305],tot,ans;
struct node{
int end;
int nxt;
void add(int x,int y,int num[]){
end=y;
nxt=num[x];
num[x]=tot;
}
}lin[605],edge[305];
vector<int>dep[305];
int count(int x,int depth){
sum[x]++;
vis[x]++;
dep[depth].push_back(x);
for(int i=num1[x];i;i=lin[i].nxt){
int y=lin[i].end;
if(vis[y])
continue;
edge[++tot].add(x,y,num2);
sum[x]+=count(y,depth+1);
}
return sum[x];
}
int cnt;
void insert(int x,int opt){
vis[x]=opt;
for(int i=num2[x];i;i=edge[i].nxt)
insert(edge[i].end,opt);
}
void dfs(int depth){
for(int i=0;i<dep[depth+1].size();i++){
int x=dep[depth+1][i];
if(vis[x])
continue;
insert(x,1);
cnt+=sum[x];
ans=max(ans,cnt);
dfs(depth+1);
insert(x,0);
cnt-=sum[x];
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
lin[++tot].add(x,y,num1);
lin[++tot].add(y,x,num1);
}
tot=0;
memset(vis,0,sizeof(vis));
count(1,1);
memset(vis,0,sizeof(vis));
dfs(1);
printf("%d\n",n-ans);
return 0;
}
这题是真的大水题