6.1浇水次数

这个就是从最后面开始浇水的,会使这条路上的所有沟都有水,可以用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;
}
原文地址:https://www.cnblogs.com/wzl19981116/p/10087290.html