数据结构管道铺设施工的最 佳方案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout<<i<<"到"<<j<<"代价为:"<<g.a[i][j]<<endl; }
cout<<endl; } } void graph::dfs(graph g,int i) { int j; cout<<g.v[i]<<" "; visited[i]=true; //标记表示已被访问过 for(j=1;j<=n;j++)
cout<<g.ct[i].fromvex<<" "; cout<<g.ct[i].endvex<<" "; cout<<g.ct[i].weight<<endl; } cout<<"*************深度优先遍历 ***********************************"<<endl; cout<<"输入开始访问的居民点:"; cin>>m; cout<<endl; cout<<"已访问居民点:"; g.dfs(g,m); cout<<endl; }
if(g.ct[j].weight<min) {
min=g.ct[j].weight; m=j; } edgeset temp=g.ct[k-1]; g.ct[k-1]=g.ct[m]; g.ct[m]=temp; j=g.ct[k-1].endvex; for(i=k;i<n;i++) { g1=g.ct[i].endvex; w=g.a[j][g1]; if(w<g.ct[i].weight) {
}; class graph { public:
int w; int v[n+1]; //存放顶点 int a[n+1][n+1]; //邻接矩阵 edgeset ct[n+1]; //最小生成树的边集 void create(graph &g);//建立邻接矩阵 void print(graph g); //输出邻接矩阵 void dfs(graph g,int i); //深度优先遍历 void prim(graph &g); //普利姆算法
由于在实际问题中,居民数量一般很有限,而任何两个居民区都可 能有连线, 即这样的图应该是边较为稠密的。因此,我们选择了普利姆算法对问题 进行求解。
三、总体设计
普利姆算法的思想是:从连通网N={V,E}中的某一顶点U0出发,选 择与它关联的具有最小权值的边(U0,v),将其顶点加入到生成树的顶点 集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条 边中选择权值最小的边(u,v),把它的顶点加入到集合U中。如此继续下 去,直到网中的所有顶点都加入到生成树顶点集合U中为止。
五、程序调过程
Create
Main Print Prim Dfs
六、程序测试
六、总结
通过数据结构的课程设计使我们对所学的知识有了更好的理解,也增强 了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用 能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的 差距。 程序的运行结果与理论推导结果吻合,即该算法与程序设计满足课程设 计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自 然地想到这种解法。主要缺点是程序的变动性比较差,类中没有私有成 员,都以公有定义!
}; 2、类的成员函数的实现 void graph::create(graph &g) {
int i,j,k; cout<<"请输入"<<n<<"居民点信息:"; for(k=1;k<=n;k++) {
cin>>g.v[k]; } //输入居民点信息 fຫໍສະໝຸດ Baidur(i=1;i<=n;i++)
for(j=1;j<=n;j++) if(i==j)g.a[i][j]=0; else g.a[i][j]=9999; //9999代表无穷 cout<<endl;
if((g.a[i][j]!=9999)&&(g.a[i][j]!=0)&&(!visited[j])) dfs(g,j);
} void graph::prim(graph &g) {
int i,j,k,min,g1,m,w; for(i=1;i<n;i++) //从顶点1出发求最小生成树的边 {
g.ct[i].fromvex=1; g.ct[i].endvex=i+1; g.ct[i].weight=g.a[1][i+1]; } for(k=2;k<=n;k++) { min=9999; m=k-1; for(j=k-1;j<n;j++) //找权值最小的树边
g.create(g); //建立网的邻接矩阵 cout<<"****************输出信息 ********************************"<<endl; g.print(g); cout<<"***************普利姆算法求最小生成树 *********************************"<<endl; g.prim(g);//用普利姆算法求最小生成树 for(i=1;i<n;i++) {
根据对模型的功能分析,该管道铺设设计应有以下模块: 1、 管道铺设信息的输入 2、 最小生成树信息的输出
功能模块图: 管道铺设问题
建立最小生成树并输出 信息输入模块
最小生成树问题
四、详细设计
1、类定义: class edgeset //定义一条生成树的边边 { public:
int fromvex; //边的起点 int endvex; //边的终点 int weight; //边的权值
g.ct[i].weight=w; g.ct[i].fromvex=j; } } } } 3、主函数main void main() { int i,j,m; graph g; cout<<"****************输入信息 ********************************"<<endl;
for(k=1;k<=e;k++) //输入一条边(i,j)的代价w {
cout<<"请输入一条管道及管道上的代价:"; cin>>i>>j>>w; g.a[i][j]=w; g.a[j][i]=w; } } void graph::print(graph g) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) {
N(N>10)个居民之间需要铺设煤气管道。假设任意两个居民之间都可 以铺设煤气管道,但代价不同。事先将任意两个居民之间铺设煤气管道 的代价存入磁盘文件中。设计一个最佳方案使得这N个居民之间铺设煤 气管道所需代价最少,并希望以图形方式在屏幕上输出结果。
二、需求分析
在N(N>10)个居民区之间铺设煤气管道所需代价最小,即求最小 生成树问题。在我们的课本中介绍了两种求解方法:普利姆算法和克鲁 斯卡尔算法。普利姆算法与网的变数无关,适宜求解边稠密的网的最小 生成树。而克鲁斯卡尔算法正好相反,适宜求解边稀疏的最小生成树。
相关文档
最新文档