参考:blackcat
bitset 优化floyd
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e3 + 10;
const int INF = 1e9 + 10;
int n, m;
bitset<qq> mp[qq];
void Floyd() {
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
if(mp[j][i]) mp[j] |= mp[i];
}
}
}
int main(){
scanf("%d%d", &n, &m);
for(int a, b, i = 1; i <= m; ++i) {
scanf("%d%d", &a, &b);
mp[a][b] = 1;
}
Floyd();
int ans = 0;
for(int i = 1; i <= n; ++i) {
for(int j = i + 1; j <= n; ++j) {
if(!mp[i][j] && !mp[j][i]) ans++;
}
}
printf("%d\n", ans);
return 0;
}