1. 程式人生 > >【bzoj5060】魔方國 亂搞+特判

【bzoj5060】魔方國 亂搞+特判

區間 覆蓋 ros else pri %d ret tdi -m

題目描述

一張未知的有重邊無自環的圖,只知道點數為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】魔方國 亂搞+特判