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数组

posted @ 2025-03-08 16:19  郭轩均  阅读(24)  评论(0)    收藏  举报