记录编号 159235 评测结果 AAAAAAAAAA
题目名称 超牛冠军赛 最终得分 100
用户昵称 GravatarDijkstra 是否通过 通过
代码语言 C++ 运行时间 3.935 s
提交时间 2015-04-20 14:17:48 内存使用 61.43 MiB
显示代码纯文本
#include<fstream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
#define MAXN 2001
using namespace std;
ifstream fin("superbull.in");
ofstream fout("superbull.out");
struct edge
{
	int u,v;
	LL w;
};
int N,F[MAXN];
edge e[MAXN*MAXN];
LL a[MAXN];
int L=0;
bool cmp(edge a,edge b)
{
	return a.w>b.w;
}
edge make_edge(int u,int v,LL w)
{
	edge ans;
	ans.u=u;ans.v=v;ans.w=w;
	return ans;
}
int find(int x)
{
	if(F[x]==x) return x;
	F[x]=find(F[x]);
	return F[x];
}
void merge(int x,int y)
{
	int X=find(x),Y=find(y);
	F[X]=Y;
}
LL Kruskal()
{
	LL ans=0;
	for(int i=1;i<=N;i++) F[i]=i;
	for(int i=0;i<L;i++)
	{
		int X=find(e[i].u);
		int Y=find(e[i].v);
		if(X==Y) continue;
		ans+=e[i].w;
		merge(X,Y);
	}
	return ans;
}
int main()
{
	fin>>N;
	for(int i=1;i<=N;i++) fin>>a[i];
	for(int i=1;i<=N;i++) for(int j=i+1;j<=N;j++) e[L++]=make_edge(i,j,a[i]^a[j]);
	sort(e,e+L,cmp);
	fout<<Kruskal()<<endl;
	return 0;
}