voiddfs(int s){ vis[s] = 1; for(int i = 0; i < g[s].size(); ++i) { int to = g[s][i]; if(!vis[to]) { dfs(to); } } st.push(s); }
intdfs1(int s){ vis1[s] = 1; int res = 1; for(int i = 0; i < gg[s].size(); ++i) { int to = gg[s][i]; if(!vis1[to]) { res += dfs1(to); } } return res; }
intmain(){ int n; scanf("%d", &n); int cnt = 0; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { int a; scanf("%d", &a); if(a) { g[i].push_back(j); gg[j].push_back(i); cnt++; } } }
for(int i = 1; i <= n; ++i) { if(!vis[i]) { dfs(i); } }
vector<int> vt;
for(int i = 1; i <= n; ++i) { int h = st.top(); st.pop(); if(!vis1[h]) { vt.push_back(dfs1(h)); } }
int ans = 0; for(int i = 0; i < vt.size(); ++i) { ans += vt[i] * (vt[i] - 1); for(int j = i + 1; j < vt.size(); ++j) { ans += vt[i] * vt[j]; } } printf("%d\n", ans - cnt); return0; }