\(P2419 [USACO08JAN] Cow Contest S\)
题目翻译:
给出\(N\)和\(M\),\(N\)为牛的个数,\(M\)为关系总数,再给出\(M\)个关系\(a,b\)及\(a\)与\(b\)相比\(a\)能获胜。求有多少牛能确定它的排名
思路:
要求出哪些牛能够找出排名,及找到那些牛与其他牛的关系可以确定。因此我们令\(a\)到\(b\)有一条边,而我们只需要判断两点是否联通,及能够推出某点与其他点的关系。我们发现\(n \le 100\),因此我们可用\(floyd\)求出关系,
\[$f_{i,j}=f_{i,j} \lor (f_{i,k} \land f_{k,j})$
\]
因此跑一遍\(floyd\)在枚举所有点判断是否有有点与他联通,时间复杂度为 \(n^3\)
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N=200;
int f[N][N];
int main(){int n,m,a,b;cin>>n>>m;for(int i=1;i<=m;i++){cin>>a>>b;f[a][b]=1;}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){f[i][j]=f[i][j]|(f[i][k]&f[k][j]);}}}int ans=0;for(int i=1;i<=n;i++){bool flag=true;for(int j=1;j<=n;j++){if(i==j)continue;flag=flag&(f[i][j]|f[j][i]);}ans+=int(flag);}cout<<ans;
}