求助站外题
  • 板块学术版
  • 楼主zhjzhmh
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/6/11 17:36
  • 上次更新2023/10/23 13:21:25
查看原帖
求助站外题
233815
zhjzhmh楼主2023/6/11 17:36

求助找树上定大连通块与外连边数量最小值

#include<bits/stdc++.h>
using namespace std;
int n,p,u,v,f[160][160],cnt,head[160],ans=0x3f3f3f3f;
vector<int> G[160];
struct node{int to,next;}edge[310];
void add(int x,int y) {edge[++cnt]=(node){y,head[x]};head[x]=cnt;}
void dfs(int u,int fa)
{
	for(int i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if(v==fa) continue;
		G[u].push_back(v);
		dfs(v,u);
	}
}
void Dfs(int u)
{
	for(auto i:G[u])
	{
		Dfs(i);
		for(int j=n;j>=1;j--)
		{
			f[u][j]++;
			for(int k=0;k<j;k++) f[u][j]=min(f[u][j],f[u][j-k]+f[i][k]);
		}
	}
}
int main()
{
	cin>>n>>p;
	for(int i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
	memset(f,0x3f,sizeof(f));for(int i=1;i<=n;i++) f[i][1]=1;
	dfs(1,0);Dfs(1);f[1][p]--;for(int i=1;i<=n;i++) ans=min(ans,f[i][p]);cout<<ans;
}

input:

11 6
1 2
1 3
1 4
1 5
2 6
2 7
2 8
4 9
4 10
4 11

standard output:

2
2023/6/11 17:36
加载中...