#10091. 「一本通 3.5 例 1」受欢迎的牛(强联通+度数结论)

2023-05-16

libreoj10091:
题解:
首先简化一下,若欢迎关系图是一个DAG(有向无环图),则只要统计每个点的出度,出度为0的点即为受所有牛欢迎的点且只有唯一一个,因为若存在两个以上出度为0的点,它们之间不可能互相欣赏,满足不了题意。
但实际情况可能存在环,环上的顶点互相之间欣赏。此时,若环外的一头牛欣赏环内某头牛,则它必定欣赏环内所有牛;而若环内某头牛欣赏环外一头牛,则环内所有牛也必定欣赏这头牛。则我们把一个环缩成一个新点,记录这个新点的大小(环的顶点数),这样最后还是等价为DAG,最后统计一下出度,若只有唯一一个,输出这个点的大小,若超过一个则无解

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int maxn=1e4+10;
int n,m;
int dfn[maxn],low[maxn],cnt;
int bcc[maxn],scc;
vector<int> G[maxn],g[maxn];
stack<int> st;
int ins[maxn];
int sum[maxn];
void init()
{
    memset(dfn,0,sizeof(dfn));
    memset(low,0,sizeof(low));
    memset(bcc,0,sizeof(bcc));
    memset(ins,0,sizeof(ins));
    memset(bcc,0,sizeof(bcc));
    memset(sum,0,sizeof(sum));
    cnt=0;
    scc=0;
    for(int i=0;i<=n;i++){
        G[i].clear();
    }
    while(!st.empty()){
        st.pop();
    }
}
void tarjan(int u)
{
   // printf("ko\n");
    dfn[u]=low[u]=++cnt;
    st.push(u);
    ins[u]=1;
    int len=G[u].size();
    for(int i=0;i<len;i++){
        int to=G[u][i];
        if(!dfn[to]){
            tarjan(to);
            low[u]=min(low[u],low[to]);
        }
        else
        if(ins[to]){
            low[u]=min(low[u],dfn[to]);
        }
    }
    if(dfn[u]==low[u]){
        ++scc;
        int m=0;
        while(1){
            int pre=st.top();
            st.pop();
            ins[pre]=0;
            bcc[pre]=scc;
            m++;
            if(pre==u)break;
        }
        sum[scc]=m;
    }
}
void dfs(int u,int fa,int cap)
{
    if(u!=fa){
        sum[u]+=cap;
    }
    int len=g[u].size();
    for(int i=0;i<g[u].size();i++){
        int to=g[u][i];
        dfs(to,fa,cap);
    }
}
int out[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    init();
    int u,v;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i]){
            tarjan(i);
        }
    }

    for(int i=1;i<=n;i++){
        for(int j=0;j<G[i].size();j++){
            int u=i,v=G[i][j];
            if(bcc[u]!=bcc[v]){
                //g[bcc[u]].push_back(bcc[v]);
                out[bcc[u]]++;
            }
        }
    }
    int res=0;
    int ans=0;
    for(int i=1;i<=scc;i++){
        if(out[i]==0){
            res++;
            ans=sum[i];
        }
    }
    if(res==1){
        printf("%d\n",ans);
    }
    else{
        printf("0\n");
    }
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#10091. 「一本通 3.5 例 1」受欢迎的牛(强联通+度数结论) 的相关文章

随机推荐

  • VINS-Mono代码解读——视觉跟踪 feature_trackers

    前言 本文主要介绍VINS的视觉处理前端的视觉跟踪模块 xff08 feature trackers xff09 论文第四章A节 xff08 IV MEASUREMENT PREPROCESSING A Vision Processing
  • 视觉SLAM中的数学——解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解

    前言 本博客主要介绍在SLAM问题中常常出现的一些线性代数相关的知识 xff0c 重点是如何采用矩阵分解的方法 xff0c 求解线性方程组AX 61 B 主要参考了 计算机视觉 算法与应用 附录A以及Eigen库的方法 本博客可能不会对分解
  • pycharm 每次打开文件都要配置解释器的解决方案

    今天在打开pycharm的时候 xff0c 又发现那个解释器不能用了 xff0c 然后在网上找解决方案 xff0c 有的说是用defautsetting解决 xff0c 然是我没有找到那个default setting 在哪里 233333
  • PS多边形套锁工具在框选区的时候一按shift键PS

    微软输入法更新导致的BUG xff0c 把微软拼音输入法设置中兼容性里使用旧版就解决了 步骤 xff1a 右键输入法 xff0c 选择设置 xff0c 选择常规 xff0c 然后拖到最下面 xff0c 勾上兼容性就可以 xff0c 如下图
  • N卡怎么修改录屏文件保存位置

    N卡的视频录制非常好用 xff0c 但是有时候找不到保存位置在哪里 xff0c 这里转载下文章记录下 xff0c 方便后续查看 首先告诉你默认位置 我的电脑下的 34 视频 34 文件夹 xff08 有的电脑里叫video xff09 如果
  • 常见的设计模式

    目录 工厂模式单例模式观察者模式策略模式代理模式装饰模式 工厂模式 这个模式有三个对象 xff1a 工厂 用户 产品 xff1b 这么说可能还有点抽象 xff0c 说具体点 xff0c 就是当我们在代码中需要生成一个类实例时 xff0c 不
  • C# 的静态构造函数和BeforeFieldInit含义

    1 静态初始化函数 xff1a 静态初始化函数 xff0c C 语法可以保证在一个程序中只调用一次 xff0c 但是会去掉默认的beforefieldinit 标记 xff08 C 默认会加 xff09 xff0c 会导致加载时机的变化 x
  • Unity万向锁

    结论 xff1a 当第二轴旋转 90 时会产生万向锁 xff0c 万向锁只发生在程序中 xff0c 现实世界不会发生 发生万向锁的底层原因是由于程序中会指定旋转顺序 xff0c 且前后顺序为父子包含关系 旋转顺序 xff1a 因为同样一组数
  • python脚本与shell脚本的相互调用

    python脚本与shell脚本的相互调用 python脚本调用shell脚本 xff1a 存在的shell脚本 xff08 test sh sh xff09 xff1a span class token comment bin csh s
  • 自动实现一个minishell更新(增加重定向功能)

    增加重定向功能 1 include lt stdio h gt 2 include lt unistd h gt 3 include lt stdlib h gt 4 include lt string h gt 5 include lt
  • linux sh 运行csh类型脚本报错

    初入linux xff0c 脚本用的是csh版本 xff0c 在尝试的过程中 xff0c 突然发现按照csh的语法写的指令 xff0c 运行不了 xff0c 例如 1 sh xff1a span class token function s
  • QT creator导入现有工程

    QT creator导入现有工程 如果从gitlib或者其他代码库下载了一些源文件 xff0c 用QT creator打开步骤如下 xff1a 点击 菜单栏的 File gt New File or Project点击 Import Pro
  • 腾讯测试开发面试题

    唉 xff0c 今天面试腾讯的测试开发工程师 xff0c 脸被打肿了 xff0c 下来查阅资料 xff0c 把一道面试题讲一讲吧 xff0c 题目是 xff1a O N 求一个数字串能整除3的连续子串的个数 xff0c 前缀和数组 43 对
  • bat命令调用rar进行文件夹压缩

    64 echo off set 34 ymd 61 date 0 4 date 5 2 date 8 2 date 11 2 date 14 2 34 rem ymd 就是当前的时间 例如20181022 34 C Program File
  • vbs执行相应的bat文件

    set ws 61 createobject 34 wscript shell 34 rem 新建一个脚本对象 do rem do loop 执行循环 ws run 34 C Users Administrator Desktop rar
  • 思岚科技RPlidar A3激光雷达ROS源码详解

    思岚科技RPlidar A3激光雷达ROS源码详解 使用 RPLIDARD 的 SDK 其实重点在于看懂client cpp和node cpp两个sample代码 xff0c 因此在这里我们讲从这里入手学习 RPLIDAR A3 的SDK
  • gcc和makefile用法总结(建议收藏)

    文章目录 64 toc 1 用GCC制作静态链接库静态链接库的创建静态链接库的使用 2 用GCC制作动态链接库动态链接库的创建动态链接库的使用 3 GCC找不到库文件怎么办 xff1f GCC生成可执行文件时找不到库文件GCC运行可执行文件
  • linux---基础IO

    在标准库中我们学习了printf xff0c fprintf xff0c sprintf xff0c snprintf等等相关的函数 xff0c 接下来是我们的系统I O调用接口 open includ e lt sys types h g
  • HDU-2121(朱刘算法优化版+虚根处理无根树形图)

    hdu2121 span class token macro property span class token directive keyword include span span class token string lt bits
  • #10091. 「一本通 3.5 例 1」受欢迎的牛(强联通+度数结论)

    libreoj10091 题解 xff1a 首先简化一下 xff0c 若欢迎关系图是一个DAG 有向无环图 xff0c 则只要统计每个点的出度 xff0c 出度为0的点即为受所有牛欢迎的点且只有唯一一个 xff0c 因为若存在两个以上出度为