SSLOJ 1469.W【树形dp】

...

  • 题意:
  • 分析:
  • 代码:


题意:

在这里插入图片描述


分析:

在这里插入图片描述


代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long 
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
struct node{
	int to,next,q;
}e[200005];
int ls[200005],cnt=0;
void add(int x,int y,int q)
{
	e[cnt]=(node){y,ls[x],q};
	ls[x]=cnt++;
	return;
}
pair<int,int> f[100005][2];
pair<int,int> operator + (pair<int,int> a,pair<int,int> b) {return make_pair(a.first+b.first,a.second+b.second);} 
void dfs(int fa,int u,int co)
{
	pair<int,int> f0=make_pair(0,0),f1=make_pair(0x3f,0x3f);
	for(int i=ls[u];~i;i=e[i].next)
	{
		int v=e[i].to;
		if(v==fa) continue;
		dfs(u,v,e[i].q);
		pair<int,int> a,b;
		a=min(f0+f[v][0],f1+f[v][1]); b=min(f1+f[v][0],f0+f[v][1]);
		f0=a;f1=b;
	}
	if(co==0||co==2) f[u][0]=min(f0,f1+make_pair(1,0));
	if(co==1||co==2) f[u][1]=min(f1+make_pair(0,1),f0+make_pair(1,1));
	return;
}
int main()
{
	int size = 256 << 20; //250M
	char*p=(char*)malloc(size) + size;
	__asm__("movl %0, %%esp\n" :: "r"(p) );
	memset(f,0x3f,sizeof(f));memset(ls,-1,sizeof(ls));
	int n=read();
	for(int i=1;i<n;i++) 
	{
		int a=read(),b=read(),c=read(),q=read();
		int co;
		if(q==2) co=2; else co=(c!=q);
		add(a,b,co);add(b,a,co);
	}
	dfs(0,1,0);
	cout<<f[1][0].first/2<<" "<<f[1][0].second;
	return 0;
}

你可能感兴趣的:(dp,树形dp)