离散数学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
离散数学实验报告
姓名:
学号:
班级:
实验地点:
实验时间:
1实验目的和要求
运用最小生成树思想和求最小生成树程序解决实际问题。实际问题描述如下:
八口海上油井相互间距离如下表,其中1号井离海岸最近,为5km。问从海岸经1号井铺设油管把各井连接起来,怎样连油管长度最短(为便于检修,油管只准在油井处分叉)?
2实验环境和工具
实验环境:Windows 7 旗舰版
工具:Dev-C++ 5.8.3
3实验过程
3.1算法流程图
3.2程序核心代码
//油管铺设问题Prim算法实现
#include
#include
using namespace std;
#define MAXV 10
#define INF 32767 //INF表示∞
typedef int InfoType;
typedef struct{
int no; //顶点编号
InfoType info; //顶点其他信息
} VertexType; //顶点类型
typedef struct{ //图的定义
float edges[MAXV][MAXV]; //邻接矩阵
int vexnum; //顶点数
VertexType vexs[MAXV]; //存放顶点信息
} MGraph; //图的邻接矩阵类型
/*输出邻接矩阵g*/
void DispMat(MGraph g){
int i,j;
for (j=0;j if (g.edges[i][j]==INF) cout< else cout< cout< } } void prim(MGraph g,int v){ //从顶点V0出发,按Prim算法构造G的最小生成树 //输出最小生成树的每条边及其权值 float Vlength[MAXV]; int i, j, k; int cloest[MAXV]; float min; float sum = 0.0; for(i=0;i Vlength[i]=g.edges[v][i]; cloest[i]=v; } min=INF; //min为其中最大的一条边=MAXV for(j=0;j if(Vlength[j]!=0&&Vlength[j] min=Vlength[j]; k=j; } } cout<<"连接油井<"< sum+=min; Vlength[k]=0; Vlength[cloest[k]]=0; for(j=0;j if(g.edges[k][j]!=0&&g.edges[k][j] Vlength[j]=g.edges[k][j]; cloest[j]=k; } } } cout<<"管道总长度为:"< } int main() { int i,j,u=3; MGraph g; float A[MAXV][10]; g.vexnum=8; for (i=0;i for (j=0;j A[i][j]=INF; A[0][1]=1.3; A[0][2]=2.1; A[0][3]=0.9; A[0][4]=0.7; A[0][5]=1.8; A[0][6]=2.0; A[0][7]=1.8; A[1][2]=0.9; A[1][3]=1.8; A[1][4]=1.2; A[1][5]=2.8; A[1][6]=2.3; A[1][7]=1.1; A[2][3]=2.6; A[2][4]=1.7; A[2][5]=2.5; A[2][6]=1.9; A[2][7]=1.0; A[3][4]=0.7; A[3][5]=1.6; A[3][6]=1.5; A[3][7]=0.9; A[4][5]=0.9; A[4][6]=1.1; A[4][7]=0.8; A[5][6]=0.6; A[5][7]=1.0; A[6][7]=0.5; for (i=0;i for (j=0;j A[j][i]=A[i][j]; for (i=0;i g.edges[i][j]=A[i][j]; cout< cout<<"各油井间距离:\n"; DispMat(g); cout< cout<<"最优铺设方案:\n"; prim(g,0); cout< return 0; } 3.3运行结果