A-TT的魔法猫
题目
思路
用弗洛伊德算法求出胜负关系的传递闭包,最后遍历数组,得出答案
代码
#include <iostream>
#include <cstring>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define memset(p,value) memset(p,value,sizeof p)
#define llint long long int
#define IOS ios::sync_with_stdio(false)
#define maxn 510
using namespace std;
int n,m,cnt,ans=0;
bool g[maxn][maxn];
void floyed() {
For(k,1,n)
For(i,1,n)
if(g[i][k])
For(j,1,n)
g[i][j]=g[i][j] || (g[i][k]&g[k][j]);
}
int main() {
IOS;
cin>>cnt;
For(cnt_,1,cnt){
ans=0;
memset(g,0);
cin>>n>>m;
ans=n*(n-1)/2;
For(i,1,m){
int u_,v_;
cin>>u_>>v_;
g[u_][v_]=1;
}
floyed();
For(i,1,n)
For(j,1,i-1)
if(g[i][j]||g[j][i]) ans--;
cout<<ans<<endl;
}
return 0;
}