#P17518. PM6648拓扑等价图形

PM6648拓扑等价图形

题目描述

考虑由若干线段组成的平面图形。我们只关心各图形的拓扑结构:如果一个图形可以通过拉伸、弯曲等连续形变变成另一个图形(形变不要求始终局限于二维平面),则称两个图形拓扑等价。

更形式化地说,一个图形可以看作某个多重图在平面上的嵌入。该多重图允许自环和重边;每个顶点对应一个互不相同的点,每条边对应一条无自交的折线路径。如果两个图形都可能由同一个多重图嵌入得到,则认为它们等价。

本题保证每条边都是互不穿越地嵌入的,也就是说,两条边只能在共同端点处相交。

输入给出若干不相交且不重叠的线段。线段格式为 x1,y1-x2,y2。两条线段如果共享一个端点,则称它们相连。

一个图形定义为满足下列条件的极小非空线段集合:集合中的任意线段都不会与集合外的线段相连。换句话说,每个图形就是由所有输入线段形成的一个连通分量。

请计算这些连通图形中存在多少种不同的拓扑类型。

输入格式

第一行输入整数 LL,表示原 String[] lineSegs 中的字符串数量。

接下来 LL 行,每行包含一个或多个线段描述,线段之间以单个空格分隔。每个线段均为:

x1,y1-x2,y2

注意:同一个连通图形的线段可能出现在不同的输入行中,输入行本身不代表连通分量。

输出格式

输出一个整数,表示不同拓扑类型的连通图形数量。

样例输入

6
0,7-5,7 5,7-5,2 5,2-0,2 0,2-0,7 5,2-7,0
8,7-15,7 15,7-10,2 10,2-8,7 10,2-10,5 10,5-12,5
16,6-19,2 16,6-22,4 22,4-21,2 21,2-19,4
24,7-24,2
25,5-27,3 27,7-29,5 25,2-27,3 29,2-27,3 25,5-27,7
27,3-29,5

样例输出

3

数据范围和限制

  • 每个连通图形包含的不同线段端点不超过 88 个;
  • 1L501\le L\le50
  • 每个输入行原始字符串长度在 775050 之间;
  • 坐标均为 0010001000 之间的整数,且没有多余前导零;
  • 每行线段之间恰好以一个空格分隔,没有行首、行尾或连续空格;
  • 任意两条线段不会部分重叠,也不会在非端点位置相交;
  • 所有线段长度均为正数。