思路讲解:
首先我们可以发现一个结论,如果点 可以到达点
且 点
和点
不直接联通,那么答案就需要
。
这里,判断点与点之间是否联通可以使用 优化。
时间复杂度:
具体的可以看一下我的简洁的代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 2010;
bitset<N> f[N];
bool st[N][N];
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n, m;
cin >> n >> m;
while (m--) {
int u, v;
cin >> u >> v;
f[u][v] = st[u][v] = true;
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
if (f[i][k]) {
f[i] |= f[k];
// f[i][j] |= f[i][k] & f[k][j]
}
}
}
int tot = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (f[i][j] && !st[i][j] && i != j) {
tot++;
}
}
}
cout << tot << "\n";
return 0;
}