[关闭]
@ysner 2018-06-07T21:47:52.000000Z 字数 1174 阅读 2233

[APIO2014]连珠线

DP


题面

戳我

解析

放两考假时再补。。。做得我心累

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=200005,inf=2000000005;
  4. struct Edge{int to,nex,z;}e[N<<1];
  5. struct data{int k,v;}d[N][2];
  6. int n,num=0,ans=0,lis[N],f[N];
  7. int I(){
  8. int x=0,f=1;char ch=getchar();
  9. for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
  10. for(;ch>='0'&&ch<='9';x=(x<<3)+(x<<1)+ch-'0',ch=getchar());
  11. return x*f;
  12. }
  13. void add(int x,int y,int z){
  14. e[++num].to=y;e[num].z=z;
  15. e[num].nex=lis[x];lis[x]=num;
  16. }
  17. void update(int x,int y,int v){
  18. if(v>=d[x][0].v)d[x][1]=d[x][0],d[x][0]=(data){y,v};
  19. else if(v>d[x][1].v)d[x][1]=(data){y,v};
  20. }
  21. void dp(int x,int fa){
  22. d[x][0].v=d[x][1].v=-inf;
  23. f[x]=0;
  24. for(int i=lis[x],y;i;i=e[i].nex)
  25. if((y=e[i].to)!=fa){
  26. dp(y,x);
  27. int t=max(f[y],f[y]+d[y][0].v+e[i].z);
  28. f[x]+=t;update(x,y,f[y]+e[i].z-t);
  29. }
  30. }
  31. void dfs(int x,int fa){
  32. ans=max(ans,f[x]);
  33. for(int i=lis[x],y;i;i=e[i].nex)
  34. if((y=e[i].to)!=fa){
  35. data d0=d[y][0],d1=d[y][1];
  36. int t1=f[y],t2=max(f[y],f[y]+d[y][0].v+e[i].z);
  37. int f1=f[x]-t2,f2=(d[x][0].k==y);
  38. int f3=max(f1,f[x]+d[x][f2].v-t2+e[i].z);
  39. f[y]+=f3;update(y,x,f1+e[i].z-f3);
  40. dfs(y,x);
  41. f[y]=t1;d[y][0]=d0;d[y][1]=d1;
  42. }
  43. }
  44. int main(){
  45. n=I();
  46. for(int i=1;i<n;++i){
  47. int x=I(),y=I(),z=I();
  48. add(x,y,z);add(y,x,z);
  49. }
  50. ans=-inf;dp(1,0);dfs(1,0);
  51. printf("%d\n",ans);
  52. return 0;
  53. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注