/*************************************************************************
* Compilation: javac Markov.java
* Execution: java Markov T
* Data files: http://introcs.cs.princeton.edu/16pagerank/tiny.txt
* http://introcs.cs.princeton.edu/16pagerank/medium.txt
*
* This program reads a transition matrix from standard input and
* computes the probabilities that a random surfer lands on each page
* (page ranks) after T matrix-vector multiplies.
*
* % java Transition < tiny.txt | java Markov 40
* 0.27303 0.26573 0.14618 0.24723 0.06783
*
*************************************************************************/
public class Markov {
public static void main(String[] args) {
int T = Integer.parseInt(args[0]); // number of iterations
int N = StdIn.readInt(); // number of pages
StdIn.readInt(); // ignore integer required by input format
// Read p[][] from StdIn.
double[][] p = new double[N][N]; // p[i][j] = prob. surfer moves from page i to page j
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
p[i][j] = StdIn.readDouble();
// Use the power method to compute page ranks.
double[] rank = new double[N];
rank[0] = 1.0;
for (int t = 0; t < T; t++) {
// Compute effect of next move on page ranks.
double[] newRank = new double[N];
for (int j = 0; j < N; j++) {
// New rank of page j is dot product of old ranks and column j of p[][].
for (int k = 0; k < N; k++)
newRank[j] += rank[k]*p[k][j];
}
// Update page ranks.
rank = newRank;
}
// print page ranks
for (int i = 0; i < N; i++) {
StdOut.printf("%8.5f", rank[i]);
}
StdOut.println();
}
}