专栏文章

CF796D解题报告

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqlvu2g
此快照首次捕获于
2025/12/04 06:56
3 个月前
此快照最后确认于
2025/12/04 06:56
3 个月前
查看原文

Solution

从每个警局往外bfsbfs,遍历到距离不超过dd的点,遍历到的边是不能删的

Code

CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5;
bool ispolice[N];
struct edge{
	int to,id;
};
vector<edge> G[N];
void addedge(int u,int v,int id){
	G[u].push_back((edge){v,id});
}
queue<pair<int,int> > q;
bool vis[N],have[N];
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	int n,k,d;cin>>n>>k>>d;
	for(int i=1;i<=k;i++){
		int t;cin>>t;
		ispolice[t]=true;
	}
	for(int i=1;i<=n-1;i++){
		int u,v;cin>>u>>v;
		addedge(u,v,i);
		addedge(v,u,i);
	}
	for(int i=1;i<=n;i++) if(ispolice[i]){
		q.push(make_pair(i,0));
		vis[i]=true;
	}
	while(!q.empty()){
		auto t=q.front();q.pop();
		int u=t.first,dep=t.second;
		for(edge e:G[u]){
			int v=e.to,id=e.id;
			if(vis[v]||dep+1>d) continue;
			have[id]=true;
			vis[v]=true;
			q.push(make_pair(v,dep+1));
		}
	}
	vector<int> ans;
	for(int i=1;i<=n-1;i++) if(!have[i]) ans.push_back(i);
	cout<<ans.size()<<endl;
	for(int i:ans) cout<<i<<' ';
	cout<<endl;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...