CF796D Police Stations 题解
CF796D Police Stations 题解
思路
其实这道题就是一个染色,因为题目保证最近的警察局一定距离小于等于 d d d,所以我们可以直接忽略 d d d,直接染色,然后记录有多少条边的 u u u 和 v v v 颜色不相同,就是答案。
代码
#include<bits/stdc++.h>
#define rep(i,s1,s2,s3) for(i = s1;i <= s2;i += s3)
#define r(i,s1,s2,s3) for(i = s1;i >= s2;i -= s3)
#define ull unsigned ll
#define INF 0x7f7f7f7f
#define ll long long
using namespace std;
int n,m,d,id,ans,col[300010],head[300010];
struct edge{
int u,v,next;
}e[600010];
void add(int u,int v){
e[++id] = edge{u,v,head[u]};
head[u] = id;
}
struct node{
int u,col;
};
queue <node> q;
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
cin>>n>>m>>d;
int i,u,v,c;
rep(i,1,m,1){
cin>>u;
q.push({u,i});
}
rep(i,2,n,1){
cin>>u>>v;
add(u,v);
add(v,u);
}
while(q.size()){
u = q.front().u;
c = q.front().col;
q.pop();
if(col[u]) continue;
col[u] = c;
for(i = head[u];i;i = e[i].next){
v = e[i].v;
q.push(node{v,c});
}
}
rep(i,1,id,2) ans += (col[e[i].u] != col[e[i].v]);
cout<<ans<<'\n';
rep(i,1,id,2) if(col[e[i].u] != col[e[i].v]) cout<<(i + 1 >> 1)<<' ';
return 0;
}