题意:给出一个图的点数和边数。一个守卫可以守护它所在的点以及与从它所在的点出发,经过不超过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);
}
}

本文探讨了一道关于图论的题目,通过分析点数、边数及守卫的覆盖范围来确定最少需要多少个守卫。根据图的连通性、点数与边数的关系,给出了具体的解题思路与实现代码。

被折叠的 条评论
为什么被折叠?



