【bzoj1827】[Usaco2010 Mar]gather 奶牛大集会 树形dp+贪心
来源:互联网 发布:思源软件 编辑:程序博客网 时间:2024/05/22 17:53
由x转移到y的答案为
可以看出只有
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<vector>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;const int N=1e5+10;ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}ll ans,C[N],dis[N],s[N];int n;vector<int>G[N],v[N];ll dfs(int x,int fa){ s[x]=C[x]; ll tot=dis[x]*C[x]; for(int i=0;i<G[x].size();i++) { int id=G[x][i],w=v[x][i]; if(id==fa)continue; dis[id]=dis[x]+w; tot+=dfs(id,x); dfs(id,x); s[x]+=s[id]; } return tot;}void solve(int x,int fa){ for(int i=0;i<G[x].size();i++) { int id=G[x][i],w=v[x][i]; if(id==fa)continue; if((s[id]<<1)>s[1]){ans=ans+(w*(s[1]-(s[id]<<1)));solve(id,x);} }}int main(){ n=read(); fo(i,1,n)C[i]=read(); for(int from,to,val,i=1;i<n;i++) { from=read();to=read();val=read(); G[from].push_back(to);G[to].push_back(from); v[from].push_back(val);v[to].push_back(val); } ans=dfs(1,0); solve(1,0); printf("%lld\n",ans); return 0;}//PS:莫名T了
附上一开始没思路,打的
T_T比裸暴力还多一个log(┬_┬)
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e5+10,inf=(1<<30);int f[N][25],dis[N],last[N],dep[N],len=0;int n,C[N];struct Edge{int to,next,val;Edge(int to=0,int next=0,int val=0):to(to),next(next),val(val){}}e[N<<1];void add_edge(int u,int v,int w){e[++len]=Edge(v,last[u],w);last[u]=len;}void dfs(int x,int fa){ for(int i=1;i<=20;i++) { if(dep[x]<(1<<i))break; f[x][i]=f[f[x][i-1]][i-1]; } for(int i=last[x];i;i=e[i].next) { if(e[i].to==fa)continue; f[e[i].to][0]=x; dep[e[i].to]=dep[x]+1; dis[e[i].to]=dis[x]+e[i].val; dfs(e[i].to,x); }}int lca(int x,int y){ if(dep[x]<dep[y])swap(x,y); int d=dep[x]-dep[y]; for(int i=0;i<=20;i++) if(d&(1<<i))x=f[x][i]; for(int i=20;i+1;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; if(x==y)return x; else return f[x][0];}int main(){ scanf("%d",&n); fo(i,1,n)scanf("%d",&C[i]); for(int u,v,w,i=1;i<n;i++) { scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w);add_edge(v,u,w); } dfs(1,0); int ans=inf; for(int i=1;i<=n;i++) { int tmp=0; for(int j=1;j<=n;j++) tmp+=(dis[i]+dis[j]-2*dis[lca(i,j)])*C[j]; ans=min(ans,tmp); } printf("%d\n",ans); return 0;}
阅读全文
0 0
- 【bzoj1827】[Usaco2010 Mar]gather 奶牛大集会 树形dp+贪心
- 【bzoj1827】[Usaco2010 Mar]gather 奶牛大集会 贪心 树规
- BZOJ1827 [Usaco2010 Mar]gather 奶牛大集会
- BZOJ1827 [Usaco2010 Mar]gather 奶牛大集会
- bzoj1827[Usaco2010 Mar]gather 奶牛大集会 树上DP
- [BZOJ1827][Usaco2010 Mar]gather 奶牛大集会(树形dp+维护)
- [BZOJ1827][Usaco2010 Mar]gather 奶牛大集会(树形dp+维护)
- 【树形DP/搜索】BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会
- 1827: [Usaco2010 Mar]gather 奶牛大集会
- [树Dfs][Usaco2010 Mar]gather奶牛大集会
- 【BZOJ 1827】 [Usaco2010 Mar]gather 奶牛大集会
- bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会
- BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会
- bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会
- BZOJ1827 奶牛大集会
- 【BZOJ1827】奶牛大集会(树形递推)
- 树形问题--奶牛大集会
- 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分答案+树形dp+贪心
- DOM4J的用法
- 斐讯k2路由器刷pandorabox认证哆点Drcom
- Java反射机制总结
- 文本编辑器添加右键打开方式
- JavaScript对象,思维导图
- 【bzoj1827】[Usaco2010 Mar]gather 奶牛大集会 树形dp+贪心
- leetcode 400. Nth Digit
- 【Mybatis升级版-04】包装类型pojo参数绑定
- springmvc常用注解
- MissionPlanner找不到全部参数表(Full Parameter List)的解决方法
- vue实例生命周期易错点
- hdu3572 Task Schedule(最大流dinic)
- C#接口--C#基础
- Android disable strictmode