BZOJ 3943 Usaco2015 Feb SuperBull Prim

题目大意:给定n个数,每次选择两个数,将两数的异或值计入答案,并删掉其中一个,反复如此直到只剩一个数为止,,求答案的最大值

每次将选择的两个数连边,那么显然会得到一棵树

用Prim算法求最大生成树即可

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 2020using namespace std;int n,a[M];long long ans;void Prim(){static int f[M];static bool v[M];int i,j,k;for(i=1;i<=n;i++){k=0;for(j=1;j<=n;j++)if(!v[j]&&f[j]>=f[k])k=j;v[k]=true;ans+=f[k];for(j=1;j<=n;j++)f[j]=max(f[j],a[k]^a[j]);}}int main(){int i;cin>>n;for(i=1;i<=n;i++)scanf("%d",&a[i]);Prim();cout<<ans<<endl;return 0;}

回避现实的人,未来将更不理想。

BZOJ 3943 Usaco2015 Feb SuperBull Prim

相关文章:

你感兴趣的文章:

标签云: