记录编号 72020 评测结果 AAAAAAAAAA
题目名称 火车站饭店 最终得分 100
用户昵称 Gravatar饺子 是否通过 通过
代码语言 C++ 运行时间 0.668 s
提交时间 2013-10-14 22:32:12 内存使用 8.58 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<ctime>
  7. using namespace std;
  8. const int lim=100011;
  9. int m,root,z;
  10. int d[lim];
  11. struct self{int x,y;}s[lim*2];
  12. int first[lim*2],nxt[lim*2];
  13. vector<int>g[lim];
  14. int a,b,c;
  15. int f[lim][2];
  16. bool flag[lim];
  17. void maketree(int i)
  18. {
  19. flag[i]=1;
  20. for(int e=first[i];e!=-1;e=nxt[e])
  21. if(!flag[s[e].y])
  22. {
  23. g[i].push_back(s[e].y);
  24. maketree(s[e].y);
  25. }
  26. }
  27. int work(int i,int chosen)
  28. {
  29. if(f[i][chosen]!=-1)return f[i][chosen];
  30. if(chosen==0)
  31. {
  32. f[i][chosen]=0;
  33. for(int k=0;k<g[i].size();k++)
  34. f[i][chosen]+=max(work(g[i][k],0),work(g[i][k],1));
  35. return f[i][chosen];
  36. }
  37. f[i][chosen]=d[i];
  38. for(int k=0;k<g[i].size();k++)f[i][chosen]+=work(g[i][k],0);
  39. return f[i][chosen];
  40. }
  41. int main()
  42. {
  43. srand(time(NULL));
  44. freopen("profitz.in","r",stdin);freopen("profitz.out","w",stdout);
  45. memset(first,-1,sizeof(first));memset(nxt,-1,sizeof(nxt));memset(f,-1,sizeof(f));
  46. scanf("%d",&m);
  47. for(a=1;a<=m;a++)scanf("%d",&d[a]);
  48. for(a=1;a<m;a++)
  49. {
  50. scanf("%d%d",&s[a].x,&s[a].y);
  51. s[a+m].x=s[a].y;s[a+m].y=s[a].x;
  52. nxt[a]=first[s[a].x];first[s[a].x]=a;
  53. nxt[a+m]=first[s[a].y];first[s[a].y]=a+m;
  54. }
  55. root=rand()%m+1;
  56. maketree(root);
  57. z=max(work(root,0),work(root,1));
  58. cout<<z<<'\n';
  59. return 0;
  60. }