传送门

题意

n个点有n-1条边相连,其中有k个特殊点,要求:

删去尽可能多的边使得剩余的点距特殊点的距离不超过d

输出删去的边数和index

分析

比赛的时候想不清楚,看了别人的题解

一道将1个联通块转化为k个树的题目,考虑上界,应该是k-1条边,这k-1条边是原图中连接树与树的边,那么我们操作如下:

1.将特殊点i染色为i,放入队列

2.做一次bfs,对每个点相邻的点染色并判断

3.遍历边,如果边的两点不同色,则输出边的index

trick

代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <bitset>
using namespace std; #define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
#define cpy(a,b) memcpy(a,b,sizeof(b))
#pragma comment(linker, "/STACK:102400000,102400000")
inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}} int n,k,d,u,v;
vector<int>vec[300300];
vector<pair<int,int> >edg;
int f[300300],color[300300],dis[300300];
int cnt;
queue<int>q; void bfs()
{
while(!q.empty())
{
int u=q.front();q.pop();
if(dis[u]==d) continue;
R(i,0,vec[u].size())
{
int v=vec[u][i];
if(!color[v])
{
color[v]=color[u];
dis[v]=dis[u]+1;
q.push(v);
}
}
}
} int main()
{
scanf("%d %d %d",&n,&k,&d);
F(i,1,k)
{
int x;
scanf("%d",&x);
f[x]=1;
}
F(i,1,n-1)
{
scanf("%d %d",&u,&v);
edg.push_back(make_pair(u,v));
vec[u].push_back(v);
vec[v].push_back(u);
}
cnt=0;
F(i,1,n)if(f[i])
{
q.push(i);
color[i]=i;
cnt++;
}
bfs();
printf("%d\n",cnt-1);
int now=0;
//F(i,1,n) printf("color[%d]=%d\n",i,color[i]);
R(i,0,n-1)
{
int u=edg[i].first,v=edg[i].second;
if(color[u]!=color[v])
{
++now;
printf("%d%c",i+1,(now==(k-1))?'\n':' ');
}
}
return 0;
}

最新文章

  1. Oracle中的commit详解
  2. 对于多个数据库表对应一个Model问题的思考
  3. Excel—SUMPRODUCT用法指南
  4. Win+R命令大全
  5. Socket实现仿QQ聊天(可部署于广域网)附源码(1)-简介
  6. word中设置前几页为罗马数字,后几页设置为阿拉伯数字
  7. tornado初步 ppt分享
  8. java的重载
  9. shell基础(一)
  10. Tomcat Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
  11. hdu3081 Marriage Match II(二分+并查集+最大流)
  12. CF798E. Mike and code of a permutation [拓扑排序 线段树]
  13. Jquery简单学习
  14. 将excel按照某一列拆分成多个文件(方案整理)
  15. 验证GridControl Gridview 单元格。
  16. C# 播放铃声最简短的代码实现方式
  17. 未能加载文件或程序集&ldquo;Microsoft.SqlServer.Management.Sdk.Sfc, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&rdquo;或它的某一个依赖项。系统找不到指定的文件。
  18. PHPExcel使用-使用PHPExcel导入文件
  19. Django 搭建后台 favicon.ico 文件操作
  20. Web.config中加了system.diagnostics节点后就不能访问了

热门文章

  1. 配置 yum 源相关
  2. 自己动手写CPU之第九阶段(4)——载入存储指令实现思路
  3. RPM安装mysql5.6
  4. DICOM-RT:放疗流程与參与角色
  5. maven优化依赖
  6. Android研究之游戏开发摄像头更新
  7. VC最小化到托盘程序
  8. SSM整理笔记1——SSM网站初步功能设计
  9. A toolbox to build your own build server
  10. Duplicate Observed Data