题目描述(简化版=非︿( ̄︶ ̄)︿原题)
就是说a->b就代表b太逊了比不过a,题中所谓的可以确定排名就是所有人都知道比他强或逊,也就是说比他强的人数+比他逊的人数=n-1(doge:有脑子就知道剩下一个人是他自己)
额额额额(⊙o⊙)…。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
这题就是这么简单,答案就是符合上述条件的人数(PS:万万没想到竟然有一题在解释题目描述是ttm就把大体思路说完了wc)
分析
既然如此那就话不多说了
所以结合上面的题目描述这题其实要我们做的就是求
知道比他强的人数+比他逊的人数=n-1人的总人数
所以说这题就跟Floyd扯上关系了???????????????????????????????????????????
这时候就要涉及到Floyd的基本应用了(ps:会的直接跳过)
Floyd的基本应用:
1.最短路计算
ps:板子
2.就是这里要用的(维护两点连通性)
继续分析
回归到正题
那么这样我们就可以用板子2号(Floyd维护连通性)来解决这个问题了
用他来维护连通性
在维护之后就统计例如
d[x][y]就是x->y,x比y强
反之就是y比x强
所以现在直接上标程
标程
#include<cstdio>
#include<iostream>
#include<queue>
#include<string>
#include<cstring>
using namespace std;
const int N=5000;
int n,m;
int f[N][N];
int main(){
cin>>n>>m;
for (int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
f[u][v]=true;
}
for (int k=1;k<=n;k++){
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if (f[i][k]&&f[k][j]){
f[i][j]=true;
}
}
}
}
int ans=0;
for (int i=1;i<=n;i++){
int cnt=0;
for (int j=1;j<=n;j++){
if (f[i][j]) cnt++;
if (f[j][i]) cnt++;
}
if (cnt==(n-1)){
ans++;
}
}
cout<<ans;
return 0;
}