【题意】给定n头牛和m对大小关系,求最坏情况下至少还需要比较几对奶牛的大小(在未确定顺序的奶牛对中随机比较)
【算法】floyd求传递闭包
【题解】可达说明大小已知,则不可达点对数量就是最少比较次数。
使用bitset优化传递闭包,复杂度O(n^3 /32)。
#include<cstdio> #include<bitset> #include<algorithm> using namespace std; const int maxn=1010; int n,m; bitset<maxn>b[maxn]; void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) if(b[i][k])b[i]|=b[k]; } int main(){ scanf("%d%d",&n,&m); int u,v; for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); b[u][v]=1; } floyd(); int ans=0; for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++)if(!b[i][j]&&!b[j][i])ans++; printf("%d",ans); return 0; }
时间: 2024-10-06 15:04:45