ปัญหา
มี n เมือง และถนน roads[i] = [u,v] network rank ของคู่เมือง = จำนวนถนนที่เชื่อมต่อกับเมืองใดเมืองหนึ่ง (ถนนที่เชื่อมทั้งสองนับ 1 ครั้ง) maximal network rank = ค่าสูงสุดของทุกคู่
ตัวอย่าง
roads = [(0,1),(0,3),(1,2),(1,3),(2,3),(2,4)] → 5 (เมือง 1 และ 2 มี rank 5)
ขั้นตอนการแก้ปัญหา
nodes := set(), s := set(), d := defaultdict(int)- สำหรับ
(x,y)ในroads:nodes.add(x), nodes.add(y)d[x]+=1, d[y]+=1s.add((x,y))
l := sorted(range(n), key=lambda x: d[x], reverse=True)threshold := min(d[l[0]], d[l[1]])- วนคู่
(i,j)ในl:- ถ้า
d[l[j]] < threshold: break curr := d[l[i]] + d[l[j]]- ถ้า
(l[i],l[j]) in s:curr -= 1 ans = max(ans, curr)
- ถ้า
- คืน
ans
การนำไปใช้งาน (Python)
from collections import defaultdict
def solve(roads):
nodes = set()
s = set()
d = defaultdict(int)
for x, y in roads:
nodes.update([x, y])
d[x] += 1
d[y] += 1
s.add((x, y))
ans = 0
n = len(nodes)
l = list(range(n))
l.sort(key=lambda x: d[x], reverse=True)
threshold = min(d[l[0]], d[l[1]])
for i in range(len(l) - 1):
for j in range(i + 1, len(l)):
if d[l[j]] < threshold:
break
curr = d[l[i]] + d[l[j]]
if (l[i], l[j]) in s or (l[j], l[i]) in s:
curr -= 1
ans = max(ans, curr)
return ans
roads = [(0,1),(0,3),(1,2),(1,3),(2,3),(2,4)]
print(solve(roads))
อินพุต
[(0,1),(0,3),(1,2),(1,3),(2,3),(2,4)]
เอาต์พุต
5