#include<iostream>
#include<cstring>
using namespace std;
const int maxn=500+5;
bool line[maxn][maxn];
int n;
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
if(line[i][k])//在传递闭包时,在这里需要剪枝,否则TLE到死
{
for(int j=1;j<=n;j++)
{
line[i][j]|=(line[i][k]&&line[k][j]);
}
}
}
}
}
int readint()
{
char c=getchar();
while(!isdigit(c)) c=getchar();
int x=0;
while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}
return x;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(line,false,sizeof(line));
int m;
n=readint();m=readint();
while(m--)
{
int u,v;
u=readint();v=readint();
line[u][v]=true;
}
floyd();
int cnt=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(!(line[i][j]||line[j][i])) cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}
HDU 1704 rank(floyd闭包+剪枝)
最新推荐文章于 2021-07-25 17:39:58 发布