import numpy as np

# 6篇文章的引用关系（key引用了values列表中的文章）
# 文章1引用了2、4、5、6；文章2引用了4、5、6；以此类推
citations = {
    1: [2, 4, 5, 6],
    2: [4, 5, 6],
    3: [1,2,4],
    4: [5,6],
    5: [6,3],
    6: [3]
}

n = 6  # 文章总数

# 构建转移矩阵 M：M[j-1][i-1] = 1/出度(i)，表示i→j的转移概率
M = np.zeros((n, n))
for source, targets in citations.items():
    out_degree = len(targets)
    for target in targets:
        M[target - 1][source - 1] = 1.0 / out_degree

# PageRank 迭代，阻尼系数 d = 0.85
d = 0.85
rank = np.ones(n) / n  # 初始各页面权重相等

for _ in range(100):
    rank = (1 - d) / n + d * (M @ rank)

# 输出各文章的 PageRank 值
print("PageRank 算法结果：")
print("-" * 30)
for i in range(n):
    print(f"文章 {i + 1}：PageRank = {rank[i]:.6f}")

# 按影响力从大到小排序
order = np.argsort(rank)[::-1]
print("\n影响力排序（从大到小）：")
for pos, idx in enumerate(order):
    print(f"第 {pos + 1} 名：文章 {idx + 1}（PageRank = {rank[idx]:.6f}）")
