专栏文章
题解:P5865 [SEERC 2018] Tree
P5865题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqcwk1b
- 此快照首次捕获于
- 2025/12/04 02:44 3 个月前
- 此快照最后确认于
- 2025/12/04 02:44 3 个月前
题目大意
要在题目给出的有 个节点的一棵树上选取 个黑点,使最远的点对最小。
思路
进行暴力枚举。
多重循环,如果黑色点的个数超出了我们定义的变量 ,那么就将答案加入数组,最后再求最小值。
多重循环,如果黑色点的个数超出了我们定义的变量 ,那么就将答案加入数组,最后再求最小值。
AC Code
CPP#include <iostream>//超多的头文件,平时最好不要用万能头
#include <string>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cstdio>
using namespace std;
#define ll long long//宏定义
ll MAXX = 0x7fffffff;//一个超级超级超级大的数
ll A[1000000],B[1000][1000];
int main()
{
ll n,m,x,y,sum = MAXX,i,j,k;
cin >> n >> m;
for(i = 1;i <= n;i++)
{
for(j = 1;j <= n;j++)
{
B[i][j] = MAXX;//初始化
}
}
for(i = 1;i <= n;i++)
{
cin >> A[i];
B[i][i] = 0;//将B数组要清零的地方清零
}
for(i = 1;i < n;i++)
{
cin >> x >> y;
B[x][y] = B[y][x] = 1;
}
for(i = 1;i <= n;i++)
{
for(j = 1;j <= n;j++)
{
for(k = 1;k <= n;k++)
{
B[j][k] = min(B[j][k],B[j][i] + B[i][k]);
}
}
}
for(i = 1;i <= n;i++)//重要的一段,枚举
{
for(j = i;j <= n;j++)//注意j要从i开始
{
if(!A[j] || !A[i]) continue;
ll ji = 0;
for(k = 1;k <= n;k++)
{
if(A[k] && B[i][k] <= B[i][j] && B[k][j] <= B[i][j])
{
ji++;//如果符合要求就加一
}
}
if(ji >= m)
{
sum = min(sum,B[i][j]);//把sum更新
}
}
}
cout << sum;
return 0;//完结撒花
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...