import math
import sys
data = sys.stdin.read().split()
t = int(data[0])
index = 1
for _ in range(t):
n = int(data[index])
m = int(data[index+1])
index += 2
# 初始化数据结构,set()提供o(1)的查找,方便查看某两个点是否连接
graph = [set() for _ in range(n+1)]
# 构建图
for i in range(m):
u, v = int(data[index]), int(data[index+1])
graph[u].add(v)
graph[v].add(u)
index += 2
# 计算以枚举点为中心的线的数量(实际上就是计算C(n,2),n为邻居个数)
lines = 0
for i in range(1, n + 1):
deg = len(graph[i])
lines += deg * (deg - 1) // 2
# 计算三角的数量(每个三角会被记录3次,刚好满足题目p为3倍的三角数量)
triangles = 0
for i in range(1, n + 1):
neighbors = list(graph[i])
for j in range(len(neighbors)):
for k in range(j + 1, len(neighbors)):
if neighbors[k] in graph[neighbors[j]]:
triangles += 1
# 计算最简分数
p = triangles
q = lines
if p == 0:
print("0/1")
else:
# 约分,直接 math.gcd() 获取最大公因子
g = math.gcd(p, q)
p //= g
q //= g
print(f"{p}/{q}")
“线”的定义题目属于是没描述清楚,直接说3个不同的点连接且不成环则构成一条“线”更好,不然以为在求无环连通块的数量
差点给自己绕进去了,还想着创建个集合的集合储存所有有效的三角(三个顶点),实际上,由于判断3角是从当前点为顶点的视角判断的,固一个三角一定会被判断3次,所以题目才会设定 p=3倍三角个数

京公网安备 11010502036488号