bzoj5060魔方国 乱搞+特判

Posted GXZlegend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n%d" , n);
        else
        {
            if(m < n) l = n - m;
            if(!m) r = n;
            printf("%d\n" , r - l + 1);
            for(i = l ; i < r ; i ++ ) printf("%d " , i);
            printf("%d" , r);
        }
    }
    return 0;
}

 

以上是关于bzoj5060魔方国 乱搞+特判的主要内容,如果未能解决你的问题,请参考以下文章

[bzoj5404]party

bzoj 3580 冒泡排序 乱搞+思维

bzoj3562: [SHOI2014]神奇化合物

bzoj1800: [Ahoi2009]fly 飞行棋(乱搞)

BZOJ1976[BeiJing2010组队]能量魔方 Cube 最小割

[BZOJ1976][BeiJing2010组队]能量魔方 Cube