zoukankan      html  css  js  c++  java
  • 【JZOJ3347】树的难题

    description


    analysis

    • 比较麻烦树形(DP)

    • 不过这个我还是不算很懂……

    • 下次要注意思考,不要怕麻烦


    code

    #pragma GCC optimize("O3")
    #pragma G++ optimize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #define MAXN 300005
    #define MAXM MAXN*2
    #define INF 100000000000007
    #define ll long long
    #define fo(i,a,b) for (ll i=a;i<=b;++i)
    #define fd(i,a,b) for (ll i=a;i>=b;--i)
    #define rep(i,a) for (ll i=last[a];i;i=next[i])
    
    using namespace std;
    
    ll last[MAXM],next[MAXM],tov[MAXM],len[MAXM];
    ll fa[MAXN],color[MAXN],f[MAXN],g[MAXN],h[MAXN],size[MAXN];
    bool bz[MAXN];
    ll n,T,tot,pos;
    deque<ll>q;
    
    inline ll read()
    {
    	ll x=0,f=1;char ch=getchar();
    	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    	return x*f;
    }
    inline void link(ll x,ll y,ll z){next[++tot]=last[x],last[x]=tot,tov[tot]=y,len[tot]=z;}
    int main()
    {
    	freopen("T1.in","r",stdin);
    	T=read();
    	while (T--)
    	{
    		memset(f,0,sizeof(f));
    		memset(g,0,sizeof(g));
    		memset(h,0,sizeof(h));
    		memset(bz,1,sizeof(bz));
    		memset(fa,0,sizeof(fa));
    		memset(size,0,sizeof(size));
    		memset(last,0,sizeof(last));
    		memset(next,0,sizeof(next));
    		memset(tov,0,sizeof(tov));
    		memset(len,0,sizeof(len));
    		tot=pos=0,n=read();
    		fo(i,1,n)color[i]=read();
    		fo(i,1,n-1)
    		{
    			ll x=read(),y=read(),z=read();
    			link(x,y,z),link(y,x,z);
    		}
    		q.push_back(1),bz[1]=0;
    		while (q.size()<n)
    		{
    			ll x=q[pos++];
    			rep(i,x)if (bz[tov[i]])++size[x],fa[tov[i]]=x,bz[tov[i]]=0,q.push_back(tov[i]);
    		}
    		while (q.size())
    		{
    			ll x=q[q.size()-1];q.pop_back();
    			if (color[x])//白灰
    			{
    				f[x]=0;
    				rep(i,x)if (fa[tov[i]]==x)
    				{
    					ll tmp=min(g[tov[i]],h[tov[i]])+len[i];
    					f[x]+=min(f[tov[i]],tmp);
    				}
    			}
    			else f[x]=INF;
    			if (color[x]^1)//黑灰
    			{
    				g[x]=0;
    				rep(i,x)if (fa[tov[i]]==x)
    				{
    					ll tmp=min(f[tov[i]],h[tov[i]])+len[i];
    					g[x]+=min(g[tov[i]],tmp);
    				}
    				h[x]=INF;
    				rep(i,x)if (fa[tov[i]]==x)
    				{
    					ll tmp=min(f[tov[i]],h[tov[i]])+len[i];
    					tmp=h[tov[i]]+g[x]-min(g[tov[i]],tmp);
    					h[x]=min(h[x],tmp);
    				}
    			}
    			else//白
    			{
    				g[x]=INF,h[x]=0;
    				rep(i,x)if (fa[tov[i]]==x)
    				{
    					ll tmp=min(f[tov[i]],h[tov[i]])+len[i];
    					h[x]+=min(g[tov[i]],tmp);
    				}
    			}
    		}
    		printf("%lld
    ",min(f[1],min(g[1],h[1])));
    	}
    	return 0;
    }
    
  • 相关阅读:
    第三方库镜像网站
    一步步搭建tensorflow环境(最简单最详细)
    公众号图片素材下载网站
    微信小程序navigateTo详细介绍
    微信小程序ES7的使用
    Mybatis连接Oracle的配置
    微信小程序创建自定义select组件(内含组件与父页面的交互流程)
    C#WebApi如何返回json
    将json格式字符串通过JsonConvert.DeserializeObject<T>得到实体属性都为空的解决
    自由学习正则表达式
  • 原文地址:https://www.cnblogs.com/horizonwd/p/11166964.html
Copyright © 2011-2022 走看看