大小的比较有传递性,因此可以巧用求最小生成树的方法。
#include<iostream>
#include<string>
using namespace std;
int main(){
int i,j,k,cas,n,m;
bool a[100][100];
scanf("%d",&cas);
while(cas--){
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
for(i=0;i<m;i++){
scanf("%d%d",&j,&k);
a[j][k]=1;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]||(a[i][k]&&a[k][j]))
a[i][j]=1;
int aa,b,cou=0;
for(i=1;i<=n;i++){
aa=b=0;
for(j=1;j<=n;j++)
{
if(a[i][j])
aa++;
if(a[j][i])
b++;
}
if(aa>n/2||b>n/2)
cou++;
}
printf("%d\n",cou);
}
return 0;
}