欲望以提升热忱,毅力以磨平高山!|

XichenOC

园龄:1个月粉丝:4关注:0

📂题解
🔖Floyd
2025-01-20 19:13阅读: 6评论: 0推荐: 0

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;
}

本文作者:XichenOC

本文链接:https://www.cnblogs.com/XichenOC/p/18682364

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   XichenOC  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起