HDU 5242 GAME 2015上海邀请赛G题
2015-05-27 17:13
399 查看
题目链接:hdu 5242
题意:
给定一颗以1号节点为根节点的有向树,每个节点有一个权值,问从1号节点出发k次,能到达的所有节点的和的最大值。
思路:
贪心的把树的链按照权值和从大到小剖分成若干条链(过程可以根据上交书上的熟练剖分模版做细小改动),然后根据每条链的权值排序取最大的k个就是答案。
代码:
题意:
给定一颗以1号节点为根节点的有向树,每个节点有一个权值,问从1号节点出发k次,能到达的所有节点的和的最大值。
思路:
贪心的把树的链按照权值和从大到小剖分成若干条链(过程可以根据上交书上的熟练剖分模版做细小改动),然后根据每条链的权值排序取最大的k个就是答案。
代码:
[code]#include <cstdio> #include <cmath> #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn =100000+5; const int maxm=maxn+maxn; int v[maxm],info[maxn],Prev[maxm],Q[maxn],dep[maxn]; int belong[maxn],head[maxn]; long long size[maxn]; bool vis[maxn]; int cnt=0,N,nedge=0; int weight[maxn]; inline void insert(int x,int y){ ++nedge; v[nedge]=y;Prev[nedge]=info[x];info[x]=nedge; } void split(){ int l,r; memset(dep,-1,sizeof(dep)); l=0; dep[Q[r=1]=1]=0; while(l<r){ int x=Q[++l]; vis[x]=false; for(int y=info[x];y!=-1;y=Prev[y]){ if(dep[v[y]]==-1){ dep[Q[++r]=v[y]]=dep[x]+1; } } } for(int i=N;i;i--){ int x=Q[i],p=-1; size[x]=weight[x]; for(int y=info[x];y!=-1;y=Prev[y]){ if(vis[v[y]]){ if(p==-1||size[v[y]]>size[p]) p=v[y]; } } if(p==-1){ ++cnt; belong[head[cnt]=x]=cnt; } else { size[x]+=size[p]; belong[x]=belong[p]; head[belong[x]]=x; } vis[x]=true; } } bool cmp(int a,int b){ return size[head[a]]>size[head[b]]; } int ans[maxn]; long long get_ans(int k){ long long ret=0; for(int i=1;i<=cnt;i++) ans[i]=i; sort(ans+1,ans+cnt+1,cmp); for(int i=1;i<=min(cnt,k);i++){ ret+=size[head[ans[i]]]; } return ret; } int main(){ int k,a,b,T,cas=0; //freopen("data.in","r",stdin); scanf("%d",&T); while(T--){ printf("Case #%d: ",++cas); scanf("%d%d",&N,&k); memset(info,-1,sizeof(info)); cnt=0;nedge=0; for(int i=1;i<=N;i++){ scanf("%d",weight+i); } for(int i=1;i<N;i++){ scanf("%d%d",&a,&b); insert(a,b); } split(); cout<<get_ans(k)<<endl; } return 0; }
相关文章推荐
- HDU 5090 Game with Pearls(上海邀请赛水题)
- hdu 5090 Game with Pearls 2014上海全国邀请赛——题目重现
- 2015上海邀请赛——Game
- hdu 5245 2015 上海邀请赛(期望值 数学概率)
- hdu 5237 2015上海邀请赛 B - Base64 (进制转化,模拟)
- HDU - 5237 Base64 2015上海邀请赛 (模拟)
- HDU 5581 Infinity Point Sets ACM/ICPC 2015 上海区域赛 I 计算几何+组合计数
- HDU 5573 Binary Tree 2015上海现场赛B题
- HDU 5093Battle ships(2014上海邀请赛)
- hdu 5242——Game——————【树链剖分思想】
- HDU 5242 Game
- HDU-5578-Friendship of Frog【2015上海赛区】(水题)
- Hdu 5456 Matches Puzzle Game (记忆化搜索) 2015 ACM-ICPC沈阳网赛
- HDU 5475 An easy problem 2015ICPC 上海网络赛
- HDU 5242 Game(2015年上海大都会G题)
- HDU 5097 Page Rank(矩阵模拟)——2014上海全国邀请赛——题目重现(感谢上海大学提供题目)
- hdu 5245 joyful 2015acm上海大都会邀请赛
- hdu 5047 Sawtooth--2014acm上海赛区邀请赛(附java模板)
- 树形DP+并查集+左偏树, HDU-5575,Discover Water Tank,2015上海现场赛D题
- Hdu 5242 Game【Dfs+贪心】好题~