话说我用没有一点儿剪枝的暴力A了这题……
查看原帖
话说我用没有一点儿剪枝的暴力A了这题……
305891
Eraine楼主2022/1/15 10:20

代码如下:跑得最慢的点用了 189ms189ms

#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;
}

这题是真的大水题

2022/1/15 10:20
加载中...