#include #include #include #include using namespace std; typedef long long ll; void topologicalSortUtil(int v, vector& visited, stack& Stack, vector>& adj ) { visited[v] = true; for (auto i = 0; i < adj.size(); ++i) if (adj[v][i] >= 0 and !visited[i]) topologicalSortUtil(i, visited, Stack, adj ); Stack.push(v); } vector topologicalSort( vector> & adj ) { stack Stack; int V = adj.size(); vector visited( V, false ); for( int i = 0; i < V; i++ ) if( not visited[i] ) topologicalSortUtil( i, visited, Stack, adj ); vector topOrder(V); for( int i = 0; i < V; i++) { topOrder[i] = Stack.top(); Stack.pop(); } return topOrder; } int main() { int V; cin >> V; vector> Avg(V, vector(V)); for( int i = 0; i < V; i++ ) { for( int j = 0; j < V; j++ ) cin >> Avg[i][j]; } auto topOrder = topologicalSort( Avg ); // reverse topOrder reverse( topOrder.begin(), topOrder.end()); // edges vector> E(V, vector(V,-1)); // number of paths i -> j vector> M(V, vector(V,0)); for( int k = 0; k < V; k++ ) { int i = topOrder[k]; for( int l = k-1; l >= 0; --l ) { int j = topOrder[l]; if( Avg[i][j] < 0 ) continue; //cout << "Path from " << i << " to " << j << ": " << Avg[i][j] << endl; // compute number and length of all paths from i to j ll number = 0; ll sm = 0; for( int m = l+1; m < k; m++ ) { int p = topOrder[m]; if( E[i][p] < 0 ) continue; number += M[p][j]; sm += M[p][j] * (E[i][p] + Avg[p][j]); } M[i][j] = number; //cout << "#existing paths: " << number << " of total length " << sm << endl; ll scaled_avg = number * Avg[i][j]; if( scaled_avg != sm or number == 0 ) { E[i][j] = (scaled_avg + Avg[i][j]) - sm; M[i][j]++; } } } for( int i = 0; i < V; i++ ) { for( int j = 0; j < V; j++ ) cout << E[i][j] << " "; cout << endl; } cout << endl; return 0; }