这题还是挺有难度的,老师傅在讲解时给出了最优比例生成树的模板代码,然后我又结合了大神网友的代码后,自己将这题码了一遍。。。其实就是0-1分数规划问题。。
0-1分数规划一般考虑两种做法:prim+迭代或者二分法,这里我承接老师傅的意愿,用的是prim+迭代的方法,代码如下:

  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<cstdio>
  4. using namespace std;
  5. const int minint=-1e7;
  6. int cnt,n;
  7. double ans;
  8. int c[55];
  9. bool used[55];
  10. int a[55][55];
  11. int b[55][55];
  12. double dist[55];
  13. double f[55][55];
  14. struct node{
  15. int x;
  16. int y;
  17. }edge[55];
  18. double prim(){
  19. int maxv;
  20. double sum=0.0;
  21. int i,j,mark;
  22. for(i=1;i<=n;i++){
  23. dist[i]=minint;
  24. used[i]=0;
  25. for(j=1;j<=n;j++){
  26. f[i][j]=a[i][j]-ans*b[i][j];
  27. }
  28. }
  29. dist[1]=0;
  30. for(i=1;i<=n;i++){
  31. maxv=minint;
  32. mark=0;
  33. for(j=1;j<=n;j++){
  34. if(maxv<dist[j]&&!used[j]){
  35. maxv=dist[j];
  36. mark=j;
  37. }
  38. }
  39. if(i>1){
  40. cnt++;
  41. edge[cnt].x=c[mark];
  42. edge[cnt].y=mark;
  43. }
  44. used[mark]=1;
  45. sum+=dist[mark];
  46. for(j=1;j<=n;j++){
  47. if(dist[j]<f[mark][j]){
  48. dist[j]=f[mark][j];
  49. c[j]=mark;
  50. }
  51. }
  52. }
  53. return sum;
  54. }
  55. int main(){
  56. int suma,sumb,i,j;
  57. scanf("%d",&n);
  58. for(i=1;i<=n;i++){
  59. for(j=1;j<=n;j++){
  60. scanf("%d",&a[i][j]);
  61. }
  62. }
  63. for(i=1;i<=n;i++){
  64. for(j=1;j<=n;j++){
  65. scanf("%d",&b[i][j]);
  66. }
  67. }
  68. while(prim()>0.0000001){
  69. suma=sumb=0;
  70. for(i=1;i<=n;i++){
  71. suma+=a[edge[i].x][edge[i].y];
  72. sumb+=b[edge[i].x][edge[i].y];
  73. }
  74. ans=suma*(1.0)/sumb;
  75. cnt=0;
  76. }
  77. printf("%.3lf",ans);
  78. return 0;
  79. }

需要注意的是:
1.prim返回的浮点数得跟0.0000001比,跟0比会有一个超时。
2.对ans的变化赋值只能在分子上乘1.0,不能在分母上乘1.0,这是个细节,举个例子:
1x(1.0)/2=0.5而(1/2)x(1.0)=0。。。

点赞(0)
 

9.9 分

2 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论