题目大意: (越来越懒了,附上链接,不写了);
题目链接:点击打开链接
题目分析: 这个题思路很明确,传递闭包(Floyd) , 唯一需要注意的一个地方是(Floyd 需要优化一个小地方, 否则会超时, 直接见代码吧;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int d[510][510], n, m;
void init_d(){
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j) d[i][j] = (i==j);
}
void Floyd(){
for(int k = 1; k <= n; ++k)
for(int i = 1; i <= n; ++i)
if(d[i][k]) // 在这个地方优化一下;
for(int j = 1; j <= n; ++j)
if(d[k][j]) d[i][j] = 1;
}
int main()
{
// 有向图传递闭包;
int T;
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &m);
init_d();
int u, v;
for(int i = 0; i < m; ++i) { scanf("%d%d", &u, &v); d[u][v] = 1; }
Floyd();
int tot = 0;
for(int i = 1; i <= n; ++i)
for(int j = i+1; j <= n; ++j) if(d[i][j] == 0 && d[j][i] == 0) ++tot;
printf("%d\n", tot);
}
return 0;
}