题目链接
题意:给定一棵树,树的每条边的边权不是1就是2,现在规定如果选了树上的一个点,那么就可以把这个点和这个点的所有祖先节点的边权为2的边都变为1,求选最少的点使得整个树的边都为1。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
vector<pair<int,int>>g[maxn];
int du[maxn],ans[maxn],cnt=0;
int dfs(int u,int fa)
{
if(g[u].size()==0) return 0;
int flag=0;
for(auto to:g[u])
{
if(to.first==fa) continue;
int t=dfs(to.first,u);
if(to.second==2)
{
if(t==0) ans[++cnt]=to.first;
flag=1;
}
if(t==1) flag=1;
}
return (flag)?1:0;
}
int main()
{
int n,u,v,w;
scanf("%d",&n);
for(int i=1;i<n;++i)
{
scanf("%d%d%d",&u,&v,&w);
g[u].push_back({v,w});
g[v].push_back({u,w});
}
dfs(1,0);
printf("%d\n",cnt);
for(int i=1;i<=cnt;++i) printf("%d ",ans[i]);
}