• 【bzoj5060】魔方国 乱搞+特判


    题目描述

    一张未知的有重边无自环的图,只知道点数为n,边数为m。可以标记若干个点,如果一个点被标记,那么与它距离不超过k的点(包括本身)都会被覆盖。
    显然对于每张不同图,让所有点被覆盖的最小代价是不一样的。
    问:对于所有这样的图,它可能产生的最小覆盖代价是多少。

    输入

    输入一行三个数,分别为n,m,k。
    n,m<=100000,k<=100

    输出

    输出两行,第一行一个数表示最少守卫数的数量,第二行从小到大依次输出所有可能的最少守卫数。

    样例输入

    3 2 1

    样例输出

    2
    1 2


    题解

    乱搞+特判

    显然只需要求出最小覆盖代价的最小值和最大值即可,这个区间内的所有值都可能出现。

    对于一般情况,最小值显然是菊花森林(边数多的话再添加无用边),答案是max(n-m,1);由于可以有重边,因此最大值是使所有边连接相同的两个节点,答案是n-1.

    特殊情况:

    n=1,m>0:此时是无法连出任何一条边的,因此不存在这样的图,输出0;

    k=0:此时边没有用,最小值最大值都是n;

    m=0:此时算最大值时不能连两个相同节点,答案是n。

    #include <cstdio>
    int main()
    {
        int n , m , k , i , l = 1 , r;
        scanf("%d%d%d" , &n , &m , &k) , r = n - 1;
        if(n == 1 && m) printf("0");
        else
        {
            if(!k) printf("1
    %d" , n);
            else
            {
                if(m < n) l = n - m;
                if(!m) r = n;
                printf("%d
    " , r - l + 1);
                for(i = l ; i < r ; i ++ ) printf("%d " , i);
                printf("%d" , r);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    azure备份虚拟机
    本地git部署web连接azure的git存储库
    dnsmasq服务的安装与配置
    hadoop错误- slave节点无法启动data node数据节点进程,但是master节点datanode正常启动
    hadoop错误--转发-hadoop启动遇到的各种问题
    hadoop错误--集群启动master时namenode进程无法启动
    c++的字节对齐
    fstream 和 iostream
    C语言的声明的优先级规则
    齐次矩阵
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7707925.html
Copyright © 2020-2023  润新知