AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 4244. 牛的比赛    原题链接    简单

作者: 作者的头像   _marble_ ,  2022-05-01 23:34:37 ,  所有人可见 ,  阅读 293


1


算法1

(floyd最短路) $O(n^3)$

这里核心的思想是如何判断两头牛可不可比较,可以抽象为在这个单向图中两头牛可不可达,如果其中一头牛可以到达另一头牛则说明两头牛是可以比较的,如果一头牛可以和其他n-1头牛比较则说明这头牛的位次是确定的。
由于需要判断多头牛可不可达其余n-1头牛,则此问题属于多源最短路问题,应使用floyd算法预处理,毕竟数据范围才到100;

时间复杂度

参考文献

C++ 代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N =110,INF=1e9;
int g[N][N];
int n,m,ans;
int main(){
    cin >> n >> m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)//初始化
    if(i==j)g[i][j]=0;
    else g[i][j]=INF;
    while(m--){
        int x,y;
        cin >> x>> y;//存边
        g[x][y]=1;
    }
    for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)//最短路处理
    g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
        for(int i=1;i<=n;i++){
        int t=0;//记录能和第i头牛比较的牛的个数
        for(int j=1;j<=n;j++)
        if(g[i][j]<INF/2||g[j][i]<INF/2)t++;//如果距离不是正无穷说明可达
        if(t==n)ans++;//注意由于g[i][i]=0所以表示自己可以和自己比较,则当可比较数为n时才说明这头牛的位次固定
    }

    cout << ans;
} 

2 评论


用户头像
投頭   8个月前         踩      回复

牛的!大佬,连不用看代码,我就感觉会了

用户头像
_marble_   6个月前         踩      回复

我是菜菜 已经有一两个月没写题了 现在回来康复来了


你确定删除吗?
1024
x

© 2018-2024 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息