看起来很难,然而还是水。。。。
T1
呵呵。。。回家(oj1445)的弱化版,直接BFS水过。。。
T2
照样BFS水,当外星人每建立一个基地就进行一次BFS,如果当前城市的最长距离<K,就把当前城市所对应的布尔数组设为TRUE,在把总数减1,最后输出总数就AC了。
T3
这题是这套题的难点。
相信一定有很多同学没看懂题目(包括我),我来解释一下。
有P个哨所如下图(假设P为4):
①----②----③----④
之后可以给你S个阿姆斯特朗回旋加速喷气式阿姆斯特朗通话系统(雾)卫星通话系统,只有当两个拥有这个系统的哨所通话才不计距离,否则只要通话双方有一方没有这个系统就要计算距离。
例如:
①----②----③----④
10 20 30
假如②和③拥有卫星通话系统,则②和③通话不需要计算距离,而①②和③④的距离就是10和30。
然后要求你求出通话的最长距离,还要这个距离最短。
我们知道,只要给越长的两个哨站装上卫星通话系统,就可以使答案最优。
因此,我们去掉那些然并卵的东西,就变成了下面这题:
有P个节点,且每个节点都可以到达其它的节点,求第P-S(为什么是P-S可以自己去算一下)长的边的长度。
于是,这道题就变成了一道简(ri)单(gou)的
最小生成树
鉴于数据较大,所以我们采用克鲁斯卡尔算法求最小生成树。
具体怎么求。。。
(回车键卡了)
我还是说一下吧。。。
接下来是克鲁斯卡尔算法:
首先要知道并查集这个神(wei)奇(suo)的东西。
(如果不太清楚可以去看看我同学的这篇文章:http://blog.csdn.net/fengyingjie2/article/details/52192573)
↑↑↑↑↑↑↑↑↑↑↑↑↑上面是广告↑↑↑↑↑↑↑↑↑↑↑↑↑↑
之后,我们可以先计算出每个点到其它点的距离,公式如下:
设点1的坐标为(x1,y1),点2的坐标为(x2,y2),那么,点1到点2的距离为:
sqrt(sqr(x1-x2)+sqr(y1-y2))
不过我不建议使用SQR这个函数,因为一旦结果太大就不精确了。
具体可以用勾股定理来求证(怎么越扯越远了)。
之后求出每条边的距离后,我们可以按照距离进行一次快速排序。
然后,就可以开始神(wei)奇(suo)的那啥算法了。
接下来,我们要用到并查集。
我们依次枚举每一条边(x,y),如果x和y的祖先不是同一个节点(即不在同一个集合里),我们就把它们合并起来,同时把边的两个节点记录进一个数组里。
如果枚举的边数已经等于(S-1)了,那么就可以直接跳出循环。
最后输出第(P-S)条边就可以了。
T4
大水题啊!!!!
看起来好屌的样子然而并没有什么卵用啊!!!!
我们先从第一个位置进行一次DFS,之后记录下以当前节点为根节点时的节点数量(即把当前节点下的子树的节点数量加起来再加上自己本身)。
之后枚举断开的位置,如果断开之后的图节点大于当前节点的结果,就把它变成(N-节点数)。
再判断有没有超过N div 2,如果超过就继续枚举,没有超过就输出。
就这样水了过去。。。。。。。。。