设计 任务书 文档 开题 答辩 说明书 格式 模板 外文 翻译 范文 资料 作品 文献 课程 实习 指导 调研 下载 网络教育 计算机 网站 网页 小程序 商城 购物 订餐 电影 安卓 Android Html Html5 SSM SSH Python 爬虫 大数据 管理系统 图书 校园网 考试 选题 网络安全 推荐系统 机械 模具 夹具 自动化 数控 车床 汽车 故障 诊断 电机 建模 机械手 去壳机 千斤顶 变速器 减速器 图纸 电气 变电站 电子 Stm32 单片机 物联网 监控 密码锁 Plc 组态 控制 智能 Matlab 土木 建筑 结构 框架 教学楼 住宅楼 造价 施工 办公楼 给水 排水 桥梁 刚构桥 水利 重力坝 水库 采矿 环境 化工 固废 工厂 视觉传达 室内设计 产品设计 电子商务 物流 盈利 案例 分析 评估 报告 营销 报销 会计
 首 页 机械毕业设计 电子电气毕业设计 计算机毕业设计 土木工程毕业设计 视觉传达毕业设计 理工论文 文科论文 毕设资料 帮助中心 设计流程 
垫片
您现在所在的位置:首页 >>理工论文 >> 文章内容
                 
垫片
   我们提供全套毕业设计和毕业论文服务,联系微信号:biyezuopin QQ:2922748026   
《算法设计与分析-贪心法》上机实验报告
文章来源:www.biyezuopin.vip   发布者:毕业作品网站  
gin-top: 0px; margin-bottom: 0px; -ms-text-justify: inter-ideograph;">54.     return 0;

55. }

四、运行输出结果:

1、 背包问题--1262

2、 最小生成树----1036

3、 最小生成树----1191

4、 单源最短路径问题----1077

五、调试和运行程序过程中产生的问题、采取的措施及获得的相关经验教训:

1、首先是背包问题,我一开始搞错了,以为重量是不可分的,后来发现我理解错了,浪费了很多时间

2、其次是这个最小生成树的问题,尤其是1911,报错runtime error,我一直找不到错误,现在看来应该是连通性判断的问题,介于时间所限,我换了种方式进行实现,在这我将原先的代码放在这里。

1. #include <iostream>

2. #include <algorithm>

3. #include <cmath>

4. #include <cstring>

5. using namespace std;

6.

7. int arc[501][501]={0};

8. int city[101];

9.

10. typedef struct{

11.     int lowcost;    //邻接点的权值

12.     int adjvex;     //下一邻接点

13. }Element;

14.

15. int Prim(int w, int n){

16.     int i,j,k;

17.     int min;

18.     int length = 0;

19.     Element shortEdge[501];

20.     for(i=0; i<n; ++i){

21.         shortEdge[i].lowcost = arc[w][i];

22.         shortEdge[i].adjvex = w;

23.     }

24.     shortEdge[w].lowcost = 0;

25.     for(i=0; i<n-1; ++i){

26.         min = 9999;

27.         for(j=0; j<n; ++j){

28.             if((shortEdge[j].lowcost != -1)&&(shortEdge[j].lowcost < min)){

29.                 min = shortEdge[j].lowcost;

30.                 k = j;

31.             }

32.         }

33. //        cout<<shortEdge[k].adjvex<<"--"<<k<<endl;

34. //        cout<<shortEdge[k].adjvex<<" "<<k<<" "<<arc[shortEdge[k].adjvex][k]<<endl;

35.         if(arc[shortEdge[k].adjvex][k]!=-1)

36.             length += arc[shortEdge[k].adjvex][k];

37.         shortEdge[k].lowcost = 0;

38.         for(j=0; j<n; ++j){

39.             if(arc[k][j] < shortEdge[j].lowcost){

40.                 shortEdge[j].lowcost = arc[k][j];

41.                 shortEdge[j].adjvex = k;

42.             }

43.         }

44.     }

45.     return length;

46. }

47.

48. int main()

49. {

50.     int num_example;

51.     cin>>num_example;

52.     while(num_example--){

53.         int n,m,k;  //n存活城市数量 m路的数量 k连接的城市数

54.         cin>>n>>m>>k;

55.

56.         memset(arc,9999,sizeof(arc));

57.

58.         for(int i=0; i<m; ++i){

59.             int mi, mj, v;

60.             cin>>mi>>mj>>v;

61.             arc[mi-1][mj-1] = arc[mj-1][mi-1] = v;

62.             arc[i][i] = -1;

63.         }

64.         for(int i=0; i<k; ++i){

65.             int citieNum;

66.             cin>>citieNum;

67.             for(int j=0; j<citieNum; ++j)

68.                 cin>>city[j];

69.             for(int j=0; j<citieNum-1; ++j)

70.                 for(int k=j+1; k<citieNum; ++k){

71.                     arc[city[j]-1][city[k]-1] = arc[city[k]-1][city[j]-1] = 0;

72.                 }

73.         }

74.         cout<<Prim(0,n);

75.     }

76. }

,

一、实验内容:

贪心法问题。

二、所用算法的基本思想及复杂度分析:

1、 背包问题--1262

1) 基本思想

首先按照单位重量价值对重量和价值数组进行降序排序,然后从大到小依次装入背包直到装不下为止。

2) 复杂度分析

T(n)=O(n)。

2、 最小生成树----1036

1) 基本思想

选定一个顶点,然后找最短边,然后对这个最短边的邻接点找最短边,如此反复,直到所有点都已经加入。

2) 复杂度分析

最大的有两层for循环,复杂度都是O(n),所以总的就是T(n)=O(n2)。

3、 最小生成树----1191

1) 基本思想

和2类似,只不过将未输入的路径记为无穷,输入的路径存入arc矩阵,之后就是一个求最小生成树的过程。

2) 复杂度分析

同2

4、 单源最短路径问题----1077

1) 基本思想

用dijkstra算法,找从n到i的每一个最短路径,最终算得从n到0的最短路径。因为要从n到i到0,那么n到i必然是最短路径。

2) 复杂度分析

一层while和一层for循环,T(n)=O(n2)。

三、源程序及注释:

1、 背包问题--1262

2、 #include <iostream>

3、 #include <algorithm>

4、 #include <cmath>

5、 using namespace std;

6、

7、 struct Goods{

8、     int id;

9、

10、     int w=0;

11、     int v=0;

12、     double v_perw=0;

13、     int num=0;

14、 };

15、

16、

17、

18、 bool cmp(Goods good1, Goods good2){

19、     return good1.v_perw > good2.v_perw;

20、 }

21、

22、 bool cmp_id(Goods good1, Goods good2){

23、     return good1.id < good2.id;

24、 }

25、

26、 double KnapSack(Goods good[], int n, int c){

27、     double maxValue = 0;

28、     sort(good,good+n,cmp);

29、     for(int i=0; i<n; ++i){

30、         if(c>=good[i].w){

31、             maxValue += good[i].v;

32、             c -= good[i].w;

33、             good[i].num = good[i].w;

34、         }else{

35、             maxValue += c*good[i].v_perw;

36、             good[i].num = c;

37、             break;

38、         }

39、     }

40、     return maxValue;

41、 }

42、

43、 int main(){

44、     //w重量 v价值 n物品数 c背包容量

45、     Goods good[1000];

46、     int n,c;

47、     cin>>n>>c;

48、     for(int i=0; i<n; ++i){

49、         cin>>good[i].w>>good[i].v;

50、         good[i].v_perw = 1.0*good[i].v/good[i].w;

51、         good[i].id = i;

52、     }

53、     printf("%.2lf\n",KnapSack(good,n,c));

54、     sort(good,good+n,cmp_id);

55、     for(int i=0; i<n-1; ++i){

56、         cout<<good[i].num<<" ";

57、     }

58、     cout<<good[n-1].num;

59、 }

60、 最小生成树----1036

61、 #include <iostream>

62、 #include <algorithm>

63、 #include <cmath>

64、 using namespace std;

65、

66、 int arc[101][101];  //存放边的权值

67、

68、 typedef struct{

69、     int lowcost;    //最短边权值

70、     int adjvex;     //最短边的邻接点

71、 }Element;

72、

73、 int Prim(int w, int n){

74、     int i,j,k;

75、     int min;

76、     int length = 0;

77、     Element shortEdge[101];

78、     //初始化顶点w

79、     for(i=0; i<n; ++i){

80、         shortEdge[i].lowcost = arc[w][i];

81、         shortEdge[i].adjvex = w;

82、     }

83、     //加入顶点w

84、     shortEdge[w].lowcost = 0;

85、     for(i=0; i<n-1; ++i){

86、         min = 9999;

87、         //找最短边邻接点

88、         for(j=0; j<n; ++j){

89、             if((shortEdge[j].lowcost != 0)&&(shortEdge[j].lowcost < min)){

90、                 min = shortEdge[j].lowcost;

91、                 k = j;

92、             }

93、         }

94、         //cout<<shortEdge[k].adjvex<<"--"<<k<<endl;

95、         length+=arc[shortEdge[k].adjvex][k];

96、         //加入顶点k

97、         shortEdge[k].lowcost = 0;

98、         //调整数组shortEdge

99、         for(j=0; j<n; ++j){

100、             if(arc[k][j] < shortEdge[j].lowcost){

101、                 shortEdge[j].lowcost = arc[k][j];

102、                 shortEdge[j].adjvex = k;

103、             }

104、         }

105、     }

106、     return length;

107、 }

108、

109、 int main()

110、 {

111、     int n;

112、     cin>>n;

113、     for(int i=0; i<n; ++i)

114、         for(int j=0; j<n; ++j)

115、             cin>>arc[i][j];

116、     cout<<Prim(0,n);

117、     return 0;

118、 }

119、 最小生成树----1191

120、 #include <iostream>

121、 #include <cstdio>

122、 #include <cstring>

123、 using namespace std;

124、 const int maxV=505;

125、 const int Max=0x3f3f3f3f;

126、 int arc[maxV][maxV],low[maxV],visit[maxV];

127、

128、 void prim(int n){

129、     int i,j,pos,min,mst=0;

130、     memset(visit,0,sizeof(visit));

131、     pos=1;

132、     visit[1]=1;

133、     for(i=1;i<=n;++i)

134、         low[i]=arc[pos][i];

135、     //查找最短边

136、     for(i=1;i<n;++i)

137、     {

138、         min=Max;

139、         for(j=1;j<=n;j++)

140、         {

141、             if(!visit[j]&&min>low[j])

142、             {

143、                 min=low[j];

144、                 pos=j;

145、             }

146、         }

147、         mst+=min;

148、         //不连通

149、         if(mst>=Max)

150、             break;

151、         visit[pos]=j;

152、         //更新low

153、         for(j=1;j<=n;j++)

154、         {

155、             if(!visit[j]&&low[j]>arc[pos][j])

156、                 low[j]=arc[pos][j];

157、         }

158、     }

159、     //输出

160、     if(mst>=Max)

161、         printf("-1\n");

162、     else

163、         printf("%d\n",mst);

164、 }

165、 int main()

166、 {

167、     int t;

168、     cin>>t;

169、     while(t--){

170、         memset(arc,Max,sizeof(arc));

171、         int n,m,k;

172、         cin>>n>>m>>k;

173、         //新的边

174、         for(int i=0;i<m;i++)

175、         {

176、             int p,q,c;

177、             cin>>p>>q>>c;

178、             if(arc[p][q]>c)

179、                 arc[p][q]=arc[q][p]=c;

180、         }

181、         int city[101];

182、         //已连接的边

183、         while(k--){

184、             int numConnected;

185、             cin>>numConnected;

186、             for(int i=1;i<=numConnected;i++)

187、                 scanf("%d",&city[i]);

188、             for(int i=1;i<=numConnected;i++)

189、                 for(int j=i+1;j<=numConnected;j++)

190、                     arc[city[i]][city[j]]=arc[city[j]][city[i]]=0;

191、         }

192、        prim(n);

193、     }

194、     return 0;

195、 }

196、 单源最短路径问题----1077

1.  #include <iostream>

2. #include <cmath>

3. #include <queue>

4. #define INF 0x3f3f3f3f

5. using namespace std;

6.

7. const int MAX=1001;

8. int arc[MAX][MAX]={0};

9. int dis[MAX]={0};

10. bool visited[MAX]={0};

11.

12. void dijkstra(int n){

13.     queue<int> p;

14.     p.push (n);

15.     int Present = n;

16.     while(!p.empty()){

17.         Present = p.front();

18.         p.pop ();

19.         for(int i=1;i<=n;++i){

20.             if(arc[Present][i]!=INF){

21.                 dis[i] = min(dis[i],dis[Present]+arc[Present][i]);

22.             }

23.             if(!visited[i]){

24.                 p.push(i);

25.             }

26.         }

27.         visited[Present] = true;

28.     }

29.     cout<<dis[1];

30. }

31.

32. int main() {

33.     int t, n;

34.     cin>>t>>n;

35.     //初始化

36.     for(int i=1;i<=n;++i){

37.         for(int j=1;j<=n;++j){

38.             arc[i][j]=INF;

39.         }

40.     }

41.     for(int i=0;i<=n;++i){

42.         arc[i][i]=0;

43.     }

44.     for(int i=1;i<=n;++i){

45.         dis[i]=INF;

46.     }

47.     dis[n]=0;

48.     int p1,p2,l;

49.     for(int i=0;i<t;++i){

50.         scanf("%d%d%d",&p1, &p2, &l);

51.         arc[p1][p2] = arc[p2][p1] = l;

52.     }

53.     dijkstra(n);

  全套毕业设计论文现成成品资料请咨询微信号:biyezuopin QQ:2922748026     返回首页 如转载请注明来源于www.biyezuopin.vip  

                 

打印本页 | 关闭窗口
本类最新文章
中文PLC、工业PC与DCS的特 基于面向服务架构的高校宿舍微信小 自动水果采摘机:机器人苹果收割机
评估AlSiTiN和AlSiCr 基于人工智能的智能语音识别系统设 大数据舆情分析系统的设计与实现
| 关于我们 | 友情链接 | 毕业设计招聘 |

Email:biyeshejiba@163.com 微信号:biyezuopin QQ:2922748026  
本站毕业设计毕业论文资料均属原创者所有,仅供学习交流之用,请勿转载并做其他非法用途.如有侵犯您的版权有损您的利益,请联系我们会立即改正或删除有关内容!