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);
全套毕业设计论文现成成品资料请咨询