题意
- n个数,确定了m对关系(a>b)
- 求还需要多少对关系就能确定任意两个数之间的大小
思路
- 把大小关系视为一条有向边
- 这个题就变成了任意两个点是否联通
- 考虑使用FLoyd,但是n是1000量级的,刚好爆炸
- 使用bitset优化
足够
- floyd算法可以传递闭包关系
- bitset错误赋值,1是int超过32位就无效了
cin >> n >> m ;
for(int i=1;i<=m;i++){
int x,y;
cin >> x >> y;
f[x]|=(1<<(y-1));
}
代码
#include<bits/stdc++.h>
using namespace std;
bitset<1010> f[1010];
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,m;
cin >> n >> m ;
for(int i=1;i<=m;i++){
int x,y;
cin >> x >> y;
f[x][y]=1;
}
for(int j=1;j<=n;j++){
for(int i=1;i<=n;i++){
if(f[i][j]){
f[i]|=f[j];
}
}
}
int ans=n*(n-1)/2;
for(int i=1;i<=n;i++){
ans-=f[i].count();
}
cout << ans << endl;
return 0;
}