当前位置:   article > 正文

信息学奥赛一本通 1262:【例9.6】挖地雷 动态规划基本型_c++在一个地图上有 n 个地窖(n<=200),每个地窖中埋有一定数量的地雷。同时,给出地

c++在一个地图上有 n 个地窖(n<=200),每个地窖中埋有一定数量的地雷。同时,给出地

1262:【例9.6】挖地雷


时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

在一个地图上有n个地窖(n≤200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,且保证都是小序号地窖指向大序号地窖,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任意一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。

【输入】

第一行:地窖的个数;

第二行:为依次每个地窖地雷的个数;

下面若干行:

xi yi   //表示从xi可到yi,xi<yi。

最后一行为"0 0"表示结束。

【输出】

k1−k2−…−kv    //挖地雷的顺序

挖到最多的雷。

【输入样例】

6
5 10 20 5 4 5
1 2
1 4
2 4
3 4
4 5
4 6
5 6
0 0

【输出样例】

3-4-5-6
34

解析:

详见代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int a[205];//地雷数
  5. int b[205];//b[i]表示到第i个地窖,从b[i]号地窖来的路径上雷最多
  6. int c[205];//c[i]表示到第i个地窖,雷最多路径上的雷的数量
  7. bool jh=0;//第一个地窖编号前没有减号
  8. struct node {
  9. int x;
  10. int y;
  11. };
  12. node d[40005];
  13. void myprint(int x){
  14. if (x==0) return;//没有前一个地窖了
  15. myprint(b[x]);
  16. if (jh==0){//没有减号
  17. jh=1;//下次就有减号了
  18. }else{
  19. cout<<'-';//输出减号
  20. }
  21. cout<<x;
  22. }
  23. bool cmp(node x,node y){
  24. return x.x<y.x;
  25. }
  26. int main(){
  27. cin>>n;
  28. for(int i=1;i<=n;i++){
  29. cin>>a[i];
  30. }
  31. int x,y;
  32. int cnt=0;
  33. while (cin>>x>>y){
  34. if (x==0&&y==0) break;
  35. cnt++;
  36. d[cnt].x=x;
  37. d[cnt].y=y;
  38. }
  39. //按开始地窖从小到大排序,保证当计算当前地窖时,
  40. //所有通往当前地窖的路径都已经计算完成
  41. sort(d+1,d+1+cnt,cmp);//出发地窖从小到大排序
  42. for(int i=1;i<=cnt;i++){
  43. x=d[i].x;
  44. y=d[i].y;
  45. if (c[x]+a[x]>c[y]){//如果从x来路径上的雷比其他路径上多
  46. c[y]=c[x]+a[x];//记录最多得雷
  47. b[y]=x;//记录路径
  48. }
  49. }
  50. int k=0;
  51. int ans=0;
  52. for(int i=1;i<=n;i++){//枚举每一个地窖
  53. if (a[i]+c[i]>ans){//取最大值
  54. ans=a[i]+c[i];
  55. k=i;//最后一个地窖
  56. }
  57. }
  58. myprint(k);//递归打印路径
  59. cout<<endl<<ans;
  60. return 0;
  61. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/945480
推荐阅读
相关标签
  

闽ICP备14008679号