bzoj 3943: [Usaco2015 Feb]SuperBull 最大生成树

来源:互联网 发布:excel 导入 数据库 编辑:程序博客网 时间:2024/06/06 15:04

题意

贝西和她的朋友们在参加一年一度的“犇”(足)球锦标赛。FJ的任务是让这场锦标赛尽可能地好看。一共有N支球队参加这场比赛,每支球队都有一个特有的取值在1-230-1之间的整数编号(即:所有球队编号各不相同)。“犇”锦标赛是一个淘汰赛制的比赛——每场比赛过后,FJ选择一支球队淘汰,淘汰了的球队将不能再参加比赛。锦标赛在只有一支球队留下的时候就结束了。FJ发现了一个神奇的规律:在任意一场比赛中,这场比赛的得分是参加比赛两队的编号的异或(Xor)值。例如:编号为12的队伍和编号为20的队伍之间的比赛的得分是24分,因为 12(01100) Xor 20(10100) = 24(11000)。FJ相信比赛的得分越高,比赛就越好看,因此,他希望安排一个比赛顺序,使得所有比赛的得分和最高。请帮助FJ决定比赛的顺序
n<=2000

分析

显然最大生成树即使答案。

代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int N=2005;int n,a[N],dis[N],vis[N];int main(){    scanf("%d",&n);    for (int i=1;i<=n;i++) scanf("%d",&a[i]);    for (int i=1;i<=n;i++) dis[i]=a[i]^a[1],dis[1]=max(dis[1],dis[i]);    LL ans=0;vis[1]=1;    for (int i=1;i<n;i++)    {        int mx=-1,x;        for (int j=1;j<=n;j++)            if (!vis[j]&&dis[j]>mx) mx=dis[j],x=j;        ans+=mx;vis[x]=1;        for (int j=1;j<=n;j++)            if (!vis[j]) dis[j]=max(dis[j],a[x]^a[j]);    }    printf("%lld",ans);    return 0;}
原创粉丝点击