zoj 3761 Easy billiards 并查集+dfs

2014-11-24 10:20:26 · 作者: · 浏览: 1

生活真是奇妙的东西,这样的题目居然能被联想到这样的算法,只能说智商不够啊。

这道题目的意思不解释了,月赛的时候我队友已经想出来了做法,但是我们最后还是没A。


题解:

1。首先将所有能连接的球连接起来,然后看这个图有几个连通分量,那最后就会剩下几个球,这个用并查集实现下就好了。

由于xi,yi坐标比较分散所以要用邻接表进行存储。

2. 接下来就是输出方案,本来我们是想考虑点的度的,后来发现实现起来有点困难,实际上只需要按照并查集的唯一的头,进行深度优先搜索,这样就形成了一颗深搜树,

然后再用叶子节点打他的根节点就可以了。这样一次能打掉所有叶子节点(简直神奇)。

3.一开始进行2次排序,进行点的连接。

#include
  
   
#include
   
     #include
    
      #include
     
       using namespace std; int e,head[10005],root[10005],vis[10005]; struct node { int x,y; int nod,l; }s[10005],q[10005]; struct lj { int v; int next; }nn[10005]; int cmp1(struct node a,struct node b) { if(a.x==b.x) return a.y