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\n",min(f[1],min(g[1],h[1])));
}
return 0;
}

最新文章

  1. 用jQuery获取表单的值
  2. Elasticsearch增删改查 之 —— Update更新
  3. [中英双语] 数学缩写列表 (List of mathematical abbreviations)
  4. hibernate hibernate.cfg.xml component 组件
  5. php大力力 [038节] 全栈工程师的含义
  6. (转)常用的js设计模式
  7. decode-string(挺麻烦的)
  8. fzu Problem 2148 Moon Game(几何 凸四多边形 叉积)
  9. HDOJ 1312题Red and Black
  10. 【Python基础】计算项目代码行数
  11. html5权威指南:标记文字、组织内容、文档分节
  12. Java课程设计-计算器 郑子杰(201521123021)
  13. empty()和remove()的区别
  14. 找bug hhh
  15. java List&lt;String&gt;的初始化
  16. 自学Aruba7.2-Aruba安全认证-Portal认证(web页面配置)
  17. python爬虫+使用cookie登录豆瓣
  18. margin重叠现象
  19. OSGI企业应用开发(十二)OSGI Web应用开发(一)
  20. 使用Spring自定义注解实现任务路由的方法

热门文章

  1. Dll注入技术之注册表注入
  2. 解决方案-CRM:Vtiger CRM
  3. 3. Vim入门教程
  4. 高手总结CSS书写技巧
  5. hive sparksession查询只显示defalt库问题
  6. 《人月神话》读书笔记 PB16110698 第七周(~4.19)
  7. 使用&lt;script&gt;标签在HTML网页中插入JavaScript代码
  8. vue 项目 去哪儿
  9. C/C++ nullptr
  10. 安装和设置kubectl命令