P2419 [USACO08JAN] Cow Contest S

\(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;
}
posted @ 2025-01-20 19:13  XichenOC  阅读(82)  评论(0)    收藏  举报