P6975 [NEERC 2015] Cactus Jubilee

题目描述

定义一种无向连通图叫`仙人掌图(Cactus图)`。仙人掌图中没有重边和自环,并且其中的每一条边至多位于一个简单环上。简单地说,`仙人掌图`是树的一种泛化形式,其中允许出现一些环。 现在有一个`仙人掌图`,你每次可以移动一条边(移除图的一条边,并将另一对顶点用一条边连接起来)。问如果要让后来得到的新图仍然是`仙人掌图`,有多少种移动边的办法?

输入格式

第一行包含两个整数n和m,分别表示图中的顶点数(顶点的编号分别为${1,2,3,...,n}$)和边的数目,且满足 $$1≤n≤50000,0≤m≤50000$$ 第2~m+1行,每一行表示一条路径(从一个顶点出发一直往后走,直到当前所在的顶点没有任何未走过一条边)。 (译者注:虽然应该都能看出来了,但是还是用一个递归函数更浅显易懂) 设路径的开始点为$q_1$,$E_i$表示第$i$个点的边,$vis$数组中存储已经走过了的边,则整条路径可定义为: ``` 1.x←q1 2.f(x) 1.add(vis[],x) 2.for i∈Ex do 1.if i not in vis[] then 1.call f(i->to) 3.print(vis[]) ``` 即:每一行的开始有一个整数$k_i$,满足 $2≤k_i≤1000$,紧接着有$k_i$个整数,表示这条路径所经过的顶点$q_i$,满足$q_i∈[1,n]$。 数据保证路径中的相邻顶点是不同的。 在路径中可以多次到达同一个顶点,但在整个输入文件中,每条边只遍历一次。 数据保证输入文件中的图形是仙人掌。

输出格式

输出文件中只有一个整数,即移动`仙人掌图`中一条边的方法数。

说明/提示

$$1≤n≤50000,0≤m≤50000,2≤k_i≤1000,q_i∈[1,n]$$