Rank这种东西…根据定义来说就是个体在整体中的排名,那么一定需要知道这个个体和整体的关系才能知道Rank。
比如说,只有知道其他所有人的成绩,才能知道自己的排名是多少
那么问题转化为求有多少个能够 确定和其他所有点的关系 的点
传递闭包跟Floyed基本相同…就是把松弛操作改成了传递关系
需要注意的是,有关系指的是打败和被打败,要有两个判断
if(a[i][k] && a[k][j]) a[i][j] = 1;
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define debug(x) cerr<<#x<<"="<<x<<endl;
const int maxn = 110;
int n, a[maxn][maxn],m,ans;
int main() {
cin >> n >> m;
for(int i=1; i<=m; i++) {
int u,v;
cin >> u >> v;
a[u][v] = 1;
}
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(a[i][k] && a[k][j]) a[i][j] = 1;
int j;
for(int i=1; i<=n; i++) {
for(j=1; j<=n; j++) {
if(i==j) continue;
if(!a[i][j] && !a[j][i]) break;
}
if(j == n+1) ans++;
}
printf("%d",ans);
return 0;
}