图论之prim 超级牛游戏

蹲墙角

**

【问题描述】

**
现在有N(1 <= N <= 2000)头奶牛在玩 超级牛 游戏。每头奶牛有一个唯一的ID,ID范围是 1 … 2 ^ 30-1。
超级牛比赛是淘汰赛 - 每场比赛后,输者退赛,赢者继续留在比赛,直到只剩一队游戏结束。
输赢是FJ自己决定的,或者说结果可以任意决定!
比赛的积分规则十分奇葩:积分=第一队的ID XOR 第二队的ID。 比如,12队和20队打比赛,积分是24,因为01100 XOR 10100 = 11000。
FJ认为,分越高越刺激。所以他想让总积分最高。请帮助FJ设计比赛。
【输入】
第一行包含一个整数N
以下N行包含N个队伍的ID。
【输出】
最高总积分

【输入输出样例1】

4
3
6
9
10

37

输出详情:

实现37的一种方法如下:
3 VS 9 ==》9胜,本场积分 3 XOR 9 = 10,目前队伍:6 9 10
6 VS 9 ==》6胜,本场积分 6 XOR 9 = 15,目前队伍:6 10
6 VS 10 ==》管他谁胜呢反正不用再比赛了,本场积分 6 XOR 10 = 12
总积分 10 + 15 + 12 = 37。
,团队6和10面脱落,和队10胜。
拿下点的总数是(10)+(15)+(12)= 37

注:

按位异或运算,由^符号通常表示,是进行逻辑异或运算的两个二进制整数的每个位置逐位操作。
规则如下
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
例如:
10100(十进制20) XOR 01100(十进制12) = 11000(十进制24)

解析:

这题不算一道难题,从题目中的描述就可以看出来任意两头牛之间都是可以相连的,也就可以看成一个完全图。而题目要求的是要使最后的结果尽可能大,就是把AxorB看作是一条边,AxorB的值就是这条边的权值,所要求的就是走过每个点后(每个点只允许走一次)的权值累加和的最大值,也就是构造一棵最大生成树,与最小生成树(prim)并无本质上的区别,无非是把“>”改成“<”。

虚伪犹我,没考虑到会爆int,还把vis[1]写成了dis[1],md气死我了。

你可能感兴趣的:(算法,图论,prim,算法)