.
题意:给出一个图的点数和边数。一个守卫可以守护它所在的点以及与从它所在的点出发,经过不超过k条边所能到达的点。每种构图都有一个最少守卫数,问所有的最少守卫数。
题解:假如图是可以连通的,那么一定可以只用一个守卫(从一个点连n-1条边到其他点)就可以了,最多n-1个守卫(变成n-1个连通块,每个连通块一个)。不连通最少要n-m个,最多还是n-1个。注意许多特判,具体看代码。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int main()
{
scanf("%d%d%d",&n,&m,&k);
if(n<1||(n==1&&m))
{
puts("0");
}
else if(k==0||m==0)
{
printf("1\n%d",n);
}
else if(m>=n-1)
{
printf("%d\n",n-1);
for(int i=1;i<n;i++)
printf("%d ",i);
}
else
{
printf("%d\n",m);
for(int i=n-m;i<n;i++)
printf("%d ",i);
}
}