rank(floyd+bitset)

#include<iostream>
#include<bitset>
#include<cstring>
using namespace std;
const int N=500+5;
int n,m,a,b;
bitset<N>d[N];
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
if(d[i][k])d[i]|=d[k];
}
}
}
void solve(){
cin>>n>>m;
memset(d,0,sizeof(d));
while(m--){
cin>>a>>b;
d[a][b]=1;
}
floyd();
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(d[i][j]&&i!=j)ans++;
}
}
cout<<(n-1)*(n-1+1)/2-ans<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
每次记得初始化d数组

浙公网安备 33010602011771号