题意
给出n个点,n-1对关系,表示两点之间是否连通,1为连通,2为断。选中一个点,可以修复1到该点的路径上所有坏的边。求最少要选出哪些点。
思路
由于顶点数比较多,然后带权值,我们采用链式前向星建边,然后dfs。
在回溯的过程中,如果在当前点的儿子存在有问题的边,那就不选这个点
反之,如果没有并且连接这个点的边是有问题的边,这个点就是所求的点。
回溯时情况:
- 儿子存在有问题的边 不选择这个点 return 1
- 当前状态为2并且儿子下没有有问题的边,保存这个点 return 1
- 其他情况 return 0
code
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=2e5+5;
int n,cnt,k;
int head[maxn],vis[maxn];
int ans[maxn],num[maxn];
struct node{
int to,nex,w;
}e[maxn<<1];
void init(