POJ 3275 Floyd传递闭包

题意:Farmer John想按照奶牛产奶的能力给她们排序。现在已知有N头奶牛(1 ≤ N ≤ 1,000)。FJ通过比较,已经知道了M(1 ≤ M ≤ 10,000)对相对关系。每一对关系表示为“X Y”,意指X的产奶能力强于Y。现在FJ想要知道,他至少还要调查多少对关系才能完成整个排序。

思路:
bitset+Floyd传递闭包。

// by SiriusRen
#include <bitset>
#include <cstdio>
using namespace std;
bitset<1005>a[1005];
int main(){
    int n,m,xx,yy,ans=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)scanf("%d%d",&xx,&yy),a[xx][yy]=1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(a[i][j])a[i]|=a[j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i][j])ans++;
    printf("%d ",n*(n-1)/2-ans);
}

这里写图片描述

原文地址:https://www.cnblogs.com/SiriusRen/p/6532422.html