为什么贪心策略是错的
查看原帖
为什么贪心策略是错的
156059
xeri_chen楼主2021/10/18 13:51

我的想法是每次去掉一个边权最小的叶子节点的边,39分,不知道为什么错,求大佬提点。

#include<bits/stdc++.h>

using namespace std;
const int N=103;

struct road
{
	int to,w;
	road(int x,int y){
		to=x;w=y;}
	bool operator<(const road&a)const{
		return w>a.w;}
};
priority_queue<road> qu;

int r[N][N],p[N],s[N],n;
bool pd[N];

void dfs(int x)
{
	pd[x]=1;
	for(int i=1;i<=n;i++)
	{
		if(r[x][i]&&!pd[i])
		{
			s[x]++;
			p[i]=x;
			dfs(i);
		}
	}
}

int main()
{
	int q,x,y,z;
	long long ans=0;
	cin>>n>>q;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		ans+=z;
		r[x][y]=r[y][x]=z;
	}
	dfs(1);
	for(int i=1;i<=n;i++)
		if(!s[i]) qu.push(road(p[i],r[p[i]][i]));
	int sum=n-1;
	while(sum>q)
	{
		road k=qu.top();
		qu.pop();
		sum--;
		ans-=k.w;
		if(!(--s[k.to])) qu.push(road(p[k.to],r[k.to][p[k.to]]));
	}
	cout<<ans;
	return 0;
}
2021/10/18 13:51
加载中...