#树形DP# [ssloj 1469] W

Title

在这里插入图片描述


Solution

转载于:https://www.cnblogs.com/butterflydew/p/9776076.html
在这里插入图片描述


Code

#include<cstdio> 
#include<algorithm>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std; 
const int inf=1e9; 
const int N=1e5+10; 
struct node{
	int y,z,next; 
}a[N<<1];
int tot,head[N]; 
int n; 
struct nodd{
	int x,y; 
	nodd friend operator +(nodd x,nodd y){
		nodd q=(nodd){x.x+y.x,x.y+y.y}; 
		return q; 
	}
	bool friend operator <(nodd x,nodd y){
		return (x.x==y.x)?(x.y<y.y):(x.x<y.x); 
	}
}d[N][2];
void add(int x,int y,int z){
	a[++tot]=(node){y,z,head[x]}; head[x]=tot; 
}
nodd mymin(nodd x,nodd y){return x<y?x:y;} 
void dfs(int x,int fa,int flag){
	nodd w1=(nodd){inf,inf},w2=(nodd){0,0},n1,n2; 
	for(int i=head[x];i;i=a[i].next){
		int y=a[i].y;  
		if (y==fa) continue; 
		dfs(y,x,a[i].z); 
		n1=mymin(d[y][0]+w1,d[y][1]+w2); 
		n2=mymin(d[y][1]+w1,d[y][0]+w2); 
		w1=n1,w2=n2; 
	}
	if (flag==1||flag==2) d[x][1]=mymin((nodd){w1.x,w1.y+1},(nodd){w2.x+1,w2.y+1}); 
		else d[x][1]=(nodd){inf,inf}; 
	if (flag==0||flag==2) d[x][0]=mymin((nodd){w1.x+1,w1.y},w2); 
		else d[x][0]=(nodd){inf,inf}; 
}
int main(){
	int size = 256 << 20; 
    char*p=(char*)malloc(size) + size;
    __asm__("movl %0, %%esp\n" :: "r"(p) );

	scanf("%d",&n); 
	rep(i,2,n){
		int x,y,c,f; 
		scanf("%d%d%d%d",&x,&y,&c,&f); 
		c=((f==2)?f:(c!=f)); 
		add(x,y,c); add(y,x,c); 
	}
	dfs(1,0,2); 
	printf("%d %d",d[1][0].x>>1,d[1][0].y); 
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值