Indeedなう A日程 E: Page Rank
解法
最初に全社員のPage Rank を1.0としておき、定義にしたがって1000回ほど計算すると収束する。
コード
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int M = sc.nextInt(); ArrayList<ArrayList<Integer>> nLists = new ArrayList<>(); ArrayList<ArrayList<Integer>> mLists = new ArrayList<>(); for (int i = 0; i < N; i++) { nLists.add(new ArrayList<Integer>()); mLists.add(new ArrayList<Integer>()); } // lists.get(i):= iを優秀だと思っている社員のリスト for (int i = 0; i < M; i++) { int a = sc.nextInt() - 1; int b = sc.nextInt() - 1; nLists.get(a).add(b); mLists.get(b).add(a); } double[] pageRank = new double[N]; Arrays.fill(pageRank, 1.0); for (int q = 0; q < 1000; q++) { for (int i = 0; i < N; i++) { double sum = 0; for (int a = 0; a < mLists.get(i).size(); a++) { int j = mLists.get(i).get(a); sum += pageRank[j] / nLists.get(j).size(); } pageRank[i] = 0.1 + 0.9 * sum; } } for (int i = 0; i < pageRank.length; i++) { System.out.println(pageRank[i]); } } }