当前位置:首页 > 搜索 > 深度优先搜索 > 正文
SSOJ1080虫洞[USACO]
2111+

题目大意:已知n个点的坐标,两两配对后,可以互相到达(一进一出),默认可以往右走,有多少中配对方案使得在这n个点中循环走?

题目描述

农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致N个虫洞在农场上(2<=N<=12,n是偶数),每个在农场二维地图的一个不同点。

根据他的计算,约翰知道他的虫洞将形成 N/2 连接配对。例如,如果A和B的虫洞连接成一对,进入虫洞A的任何对象体将从虫洞B出去,朝着同一个方向,而且进入虫洞B的任何对象将同样从虫洞A出去,朝着相同的方向前进。这可能发生相当令人不快的后果。

例如,假设有两个成对的虫洞A(1,1) 和 B(3,1),贝茜从(2,1)开始朝着 +x 方向(右)的位置移动。贝茜将进入虫洞 B(在(3,1)),从A出去(在(1,1)),然后再次进入B,困在一个无限循环中!

| . . . .
| A > B .      贝茜会穿过B,A,
+ . . . .      然后再次穿过B

农夫约翰知道他的农场里每个虫洞的确切位置。他知道贝茜总是向 +x 方向走进来,虽然他不记得贝茜的当前位置。请帮助农夫约翰计算不同的虫洞配对(情况),使贝茜可能被困在一个无限循环中,如果她从不幸的位置开始。

输入

第1行:N,虫洞的数目

第2到N+1行:每一行都包含两个空格分隔的整数,描述一个以(x,y)为坐标的单一的虫洞。每个坐标是在范围 0..1000000000。

输出

第1行:会使贝茜从某个起始点出发沿+x方向移动卡在循环中的不同的配对数。

样例输入

4
0 0
1 0
1 1
0 1

样例输出

2

解题思路

1、建图:两两配对后,会形成双向边;在这之前,默认可以往右走,即走到y坐标相同右边最近的那个点。

读入一个点,暴力枚举另一个点,如果在同一水平线上,分两种情况:

A、当前点在左边,那么当前的的右边最近点可能更新,选靠左边的(x坐标小的)

B、当前点在右边,那么另一个点的右边最近点可能更新,选靠左边的(x坐标小的)

2、暴力配对:查找没配对的最小编号点i,在查找后面没配对的点j,然后i和j配对,即i能到j、j能到i。

配对去重:1跟2配对和2跟1配对是同一种方案,为了避免重复,我们可以规定小号跟大号配对;同时,为了避免出现1-2、3-4和3-4、1-2配对顺序不同导致重复,规定组号小的点的编号也要小。

3、判断是否卡在循环:因为可以从任意点出发,所以需要枚举起点。如果有环,那么走了n条边、n个点后,还在某个点上;否则,会一直往右走,即右边无点t[i]=0,最终在0点上。

程序实现

About

坚决不Copy代码!

本文标签:,,,,,,,,

SSOJ1080虫洞[USACO]:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!