bzoj3943[Usaco2015 Feb]SuperBull

来源:互联网 发布:三星指纹锁软件 编辑:程序博客网 时间:2024/05/22 15:01

分析:这题是真的不错。。我想了半天根本就没往生成树方面想。。倒是想到连边,但是以为直接排序以后取最大就可以了,发现顺序好像也会影响。因为每走一条边就要去掉一个点,这不是裸的最大生成树么。。看来以后还是要把题目模型进一步化简。。

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int N=1e5+5;;int n;typedef long long ll;ll ans;int a[N];void prim(){    static int f[N];    static bool bz[N];    fo(i,1,n)    {        int k=0;        fo(j,1,n)        if (!bz[j]&&f[j]>=f[k])        k=j;        bz[k]=1,ans+=f[k];        fo(j,1,n)        f[j]=max(f[j],a[k]^a[j]);    }}int main(){    scanf("%d",&n);    fo(i,1,n)scanf("%d",&a[i]);    prim();    printf("%lld\n",ans);    return 0;}
0 0