首页 > 代码库 > [POJ2342]Anniversary party
[POJ2342]Anniversary party
OJ题号:POJ2342、洛谷1352
思路:树形动规(递归实现),每次返回一个pair,分别记录包括本人的最大值和不包括本人的最大值,每次如果遇到conviviality rating为负的就忽略。
1 #include<cstdio> 2 #include<vector> 3 #include<algorithm> 4 const int N=6001; 5 std::vector<int> c[N]; 6 int r[N],p[N]={0}; 7 inline void add_edge(const int a,const int b) { 8 c[a].push_back(b); 9 p[b]=a;10 }11 std::pair<int,int> dfs(const int p) {12 int w1=r[p],w2=0;13 for(unsigned int i=0;i<c[p].size();i++) {14 std::pair<int,int> t=dfs(c[p][i]);15 if(t.second>0) w1+=t.second;16 if(t.first>0) w2+=t.second?std::max(t.first,t.second):t.first;17 }18 return std::make_pair(w1,w2);19 }20 int main() {21 int n;22 scanf("%d",&n);23 for(int i=1;i<=n;i++) scanf("%d",&r[i]);24 for(int i=1;i<n;i++) {25 int l,k;26 scanf("%d%d",&l,&k);27 add_edge(k,l);28 }29 int root;30 for(int i=1;i<=n;i++) {31 if(!p[i]) {32 root=i;33 break;34 }35 }36 std::pair<int,int> ans=dfs(root);37 printf("%d\n",std::max(ans.first,ans.second));38 return 0;39 }
[POJ2342]Anniversary party
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。