这个就是从最后面开始浇水的,会使这条路上的所有沟都有水,可以用dfs做
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define E 2.718281828459
#define sf scanf
#define scf(x) scanf("%d",&x)
#define scfff(x,y,z) scanf("%d%d%d",&x,&y,&w)
#define pf printf
#define prf(x) printf("%d
",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
#define pb push_back
void in(int &x){int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}x*=f;}
typedef long long ll;
const ll mod=1e9+100;
const double eps=1e-8;
using namespace std;
const double pi=acos(-1.0);
const int inf=0xfffffff;
const int N=1e5+5;
int vis[N];
struct Edge
{
int w,to;
Edge(int x=0,int y=0){to=x;w=y; }
}t;
vector<Edge> v[N];
int dfs(int x,int w)//这个节点的编码,和到这个点的沟是不是干的
{
vis[x]=1;
int ans=0;
rep(i,0,v[x].size())
{
int tt=0;
t=v[x][i];
if(vis[t.to]) continue;如果找过
if(v[t.to].size()==0&&t.w==2)//如果是叶子节点了,且到这个节点的沟没水,那么答案加一
{
ans++;
w=0;
}else if(v[t.to].size())
{
if(t.w== 1)
tt=dfs(t.to,0);
else
tt=dfs(t.to,1);
if(tt)
w=0;//如果下一个浇过水了,那么之前这条沟就有水了
}
ans+=tt;
}
if(w)
ans++;
return ans;
}
int main()
{
mm(vis,0);
int n;
scf(n);
rep(i,1,n)
{
int x,y,w;
in(x);in(y);in(w);
v[x].pb(Edge(y,w));
v[y].pb(Edge(x,w));
}
int ans=dfs(1,0);
prf(ans);
return 0;
}