【题目描述】

绿猪们的势力越来越强大了,小鸟们正在筹划如何对付这群强大的东西。

可是绿猪们派来一位绿猪巫师洗清了所有前线鸟儿的记忆。现在,他们只记得他们各自的领导,但是这是一个自由散漫的团队,必须要找到他们的鸟队长。(鸟队长是能管理所有的鸟儿作战,鼓舞士气,勇于拼搏在前线的英雄鸟)。

你是在后方暗地操作的司令,现有M(1 <= M <= 500)件装备,每只不同的鸟儿可以分配零件至M件装备,分配到不同的装备数量会有不同的战斗力。

绿猪们也不是吃素的,他们规划了一个方案,站成一字长蛇阵在草地上摆开阵势,静候着小鸟们。

此时,你也只好得选出一条长链来应战绿猪。(温馨提示:小鸟的编号从1开始)

现在,你的任务有三:

一) 输出鸟队长的编号

二) 输出将M件装备分配后整个团队的战斗力的最大值

三) 以鸟队长为首的最大战斗力的战斗长链的鸟儿的序列

【输入格式】

第一行包含两个整数,N,M(N表示小鸟的数量,1 <= N <= 100) 第2行至N+1行,每行M+1个整数:第一个整数表示谁指挥这只鸟儿,第2至M+1个整数表示这只鸟儿分配I件装备所获得的战斗力

【输出格式】

输出有三行:第一行输出鸟队长的编号,第二行输出将M件装备分配后整个团队的战斗力的最大值,第三行输出以鸟队长为首的战斗长链的节点序列。(按字典序最小输出,具体格式请参考样例输出) 注意如果第一问无解,则输出“not found”,后面不输出。

【输入样例】

3 2
0 2 1
1 1 3
1 3 1

【输出样例】

1
5
1->3

【题目解析】

对于本题的第一问,解法有多种,可供大家选择,最简单的方法是扫描所有结点一遍,找到入度为 0 的点。或者是用 Floyd 求出传递闭包(有向图),当且仅当一个点能够访问到所有结点时,即为本问解。

然而第二问经过分析,则是一个简单的资源分配类DP,即将 M 件装备分配给 N 只鸟儿所获得的最大战斗力。

容易列出方程:F[i,j]=max{F[i,j],F[k,j-1]+A[j,i-k]}(0<=k<=i)F[i,j]表示i件装备分发给前j只鸟所获取的最大战斗力和,A[i,j]表示第i只鸟得到j件装备可以获得的战斗力。

第三问是求树的最长单链,简单的树形动态规划法或者搜索就能解决。由于是字典序最小,所以严格控制好判定方向即可F[i]=F[k]+A[i]。

【代码】

#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int read(){//快读 int s=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}return s*f;
}
int n,m,cnt,h[105],p[105][505],f[105][505],num[105],dis[105];
bool s[105][505][505];//s[i][j][k]标记:在二问最大战斗力的情况下共j个装备第i只鸟是否获得了k个装备
struct edge{//前向星,即邻接表 int to,next;
}d[205];
void hqq_add(int x,int y){cnt++;d[cnt].to=y;d[cnt].next=h[x];h[x]=cnt;
}
struct data{//广搜中每种情况的状态 int sum,l,ans[105],x;//x为当前位置,ans存当前路径,sum存路径长度
}c,main_ans;
queue<data>q;//用于广搜
int main(){int i,j,k;n=read();m=read();for(i=1;i<=n;i++){j=read();if(j)hqq_add(j,i);else{//找到鸟队长 因为鸟队长不被管理 printf("%d\n",i);c.x=i;}for(j=1;j<=m;j++){p[i][j]=read();}}if(!c.x){//注意如果第一问无解,则输出“not found”,后面不输出。printf("not found");return 0;}for(i=1;i<=n;i++){//多重背包 for(j=1;j<=m;j++){f[i][j]=f[i-1][j];for(k=1;k<=j;k++){if(f[i][j]<f[i-1][j-k]+p[i][k]){f[i][j]=f[i-1][j-k]+p[i][k];s[i][j][k]=1;}}}}printf("%d\n",f[n][m]);//二问的答案 j=n;k=m;while(j!=0&&k!=0){//处理在二问最优情况下每只鸟的装备数量 for(i=k;i>=1;i--){if(s[j][k][i]){k-=i;num[j]=i;//num->装备数量 break;}}j--;}for(i=1;i<=n;i++){num[i]=p[i][num[i]];//num->每只鸟的战斗力
    }c.sum=num[c.x];c.ans[++c.l]=c.x;q.push(c);while(q.size()){//进行广搜,寻找第三问的解 data now=q.front();q.pop();for(i=h[now.x];i;i=d[i].next){j=d[i].to;if(dis[j]<dis[now.x]+num[j]){//路径更优秀,更新(update)
                data des;des.x=j;des.sum=dis[j]=dis[now.x]+num[j];memcpy(des.ans,now.ans,sizeof(now.ans));//复制之前的路径 des.l=now.l+1;//将当前位置存入路径中 des.ans[des.l]=des.x;q.push(des);if(des.sum>main_ans.sum){//main_ans用于存储最优值 main_ans=des;}}}}printf("%d",main_ans.ans[1]);//输出最优路径即可 for(i=2;i<=main_ans.l;i++){printf("->%d",main_ans.ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/kirito-hqq/p/9558117.html

【图论】Angry Birds——BSOJ 2900相关推荐

  1. Angry Birds Rio 攻略 1-1

    Angry Birds Rio 攻略 1-1 1-1 基本攻略データ パイナップル:× 手持ちの鳥 :赤4 appllioが三ツ星獲得した得点:61700 三ツ星攻略メモ 1-1は練習ステージのような ...

  2. 愤怒的小鸟4只编外鸟_丽萨荐书 愤怒的小鸟 Angry Birds ICR #1

     <愤怒的小鸟> Angry Birds ICR #1 在我们往期推荐的绘本中,很少出现Level 2级别的,My First和Level 1的作品居多,如饼干狗.皮特猫.啪嗒猫系列等.这 ...

  3. 愤怒的小鸟重制版 Angry Birds Reloaded for Mac(经典的休闲游戏)

    小伙伴们,还记那年横空出世的愤怒的小鸟吗?滑动手指,蓄力拉满,直冲小绿猪猪? 愤怒的小鸟重制版 Angry Birds Reloaded又回来啦,并且在全新的版本上面加入了红色,查克,炸弹,银和其他帮 ...

  4. Chrome游戏:超级玛丽(Super Mario Bros. Crossover)、愤怒的小鸟(Angry Birds

    查看原文:http://www.hellonet8.com/431.html 好久没有去关注chrome的扩展有游戏了,今天闲来没事,就去chrome的应用商店去瞧了下,发现几个不错的chrome游戏 ...

  5. Angry Birds专用平板Wopad V7+,深圳造

    如果你认为愤怒的小鸟(Angry Birds)热度已经消退,那么你就错了.Rovio正在做许多的品牌推广计划,希望让他们品牌成为像任天堂的玛丽奥或米老鼠一样,拥有众多以愤怒的小鸟为主题的游戏.公仔等产 ...

  6. Angry Birds和广告系统泄露个人信息——FireEye对Angry Birds的分析

    我是壮丁 · 2014/04/14 12:50 from:www.fireeye.com/blog/techni- 0x00 背景 很多流行的app,包括愤怒的小鸟在内,收集并且分享玩家的个人信息的广 ...

  7. 用Android模拟器体验angry birds

    这几天IT新闻里面没天都充斥着愤怒的小鸟(Angry birds)的新闻,微博上讨论的也不少,但是苦于囊肿羞涩,不能用真机见识一下这款今年的年度游戏,于是就想到能不能用模拟器体验一下这款游戏!愤怒的小 ...

  8. Angry Birds 中的 Chrome 彩蛋们

    玩腻了移动设备中Angry Birds的关卡?现在你可以试试Chrome中的Angry Birds,会给你带来不一样的游戏感觉. Chrome版的Angry Birds不但设计了新的 Chrome 专 ...

  9. Angry Birds for Chrome 升级,带来圣诞新关卡和 Mighty Eagle

    Chrome版的Angry Birds升级了!这个新的1.2.0版本里增加了专为圣诞节设计的关卡,以及iOS平台上早就有了的极具破坏力的Mighty Eagle. 具体包括: 42个关卡可用Might ...

最新文章

  1. java jersey使用总结_jersey使用指南
  2. 为jQuery的$.ajax设置超时时间
  3. html5中高德、腾讯、百度 地图api调起手机app
  4. 印度软件业崛起的奥妙
  5. mysql 内存表使用教程_MySQL的内存表的基础学习教程
  6. [转] C# 路径(目录)
  7. 【python数字信号处理】——scipy库设计滤波器(IIR为例)、绘制滤波器频谱响应、IIR滤波器滤波、读写wav音频文件
  8. mysql key buffer_mysql 开发进阶篇系列 16 MySQL Server(myisam key_buffer)
  9. Nodejs学习笔记(六)——Mysql模块
  10. ACL-IJCNLP 2021|行业首个少样本NER数据集,清华联合阿里达摩院开发
  11. 第01期:salesforce开发环境的搭建
  12. python 使用多线程进行压力测试
  13. jmeter接口自动化
  14. UopenCryptionKit4Java:一个好用的轻量开源加解密器工具包
  15. 钢铁侠java_现代版“钢铁侠”,无所不能的程序员,java工程师实现人造器官!...
  16. 搜狗二季度财报解读:有扎实的现在,也有性感的未来
  17. Kali使用中文输入法
  18. DR、BDR、SBR、ASBR等名词的解释和原理
  19. 12864多级菜单实现方法
  20. 强制删除五笔字型输入法

热门文章

  1. 风变编程学习笔记for循环应用:演员的作品
  2. 802.11为什么采用CSMA/CA协议
  3. 用JAVA判断一个数是否为素数(质数)
  4. TextBox换行C#文本框换行.net文本框换行textarea换行
  5. 精益生产浪费有哪些?如何减少消除精益生产中的浪费?
  6. linux库函数实现复制文件,linux应用编程笔记(6)库函数方式实现文件复制编程...
  7. 研发转至FAE(现场应用工程师),是否远离技术了?有前途吗?
  8. 科技云报道:勒索软件一次次破防,我们拿什么“守城”?
  9. C#如何设置 textbox 的输入的内容为数字
  10. SQL注入-整型注入实例