专栏文章
CF796D解题报告
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqlvu2g
- 此快照首次捕获于
- 2025/12/04 06:56 3 个月前
- 此快照最后确认于
- 2025/12/04 06:56 3 个月前
Solution
从每个警局往外,遍历到距离不超过的点,遍历到的边是不能删的
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 条评论,欢迎与作者交流。
正在加载评论...