数据结构实验报告 图的应用

实验七 图的应用

——宋京松 [1**********]2

一、实验目的

1、使学生可以巩固所学的有关图的基本知识。

2、熟练掌握图的存储结构。

3、掌握如何应用图解决各种实际问题。

二、实验内容

本次实验提供2个题目,学生可以任选一个!

题目一:最小生成树问题

[问题描述]

若要在n 个城市之间建设通信网络,只需要假设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。

[基本要求]

1.利用克鲁斯卡尔算法求网的最小生成树。

2.要求输出各条边及它们的权值。

[实现提示]

通信线路一旦建成,必然是双向的。因此,构造最小生成树的网一定是无向网。设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数。

图的存储结构的选取应和所作操作相适应。为了便于选择权值最小的边,此题的存储结构既不选用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组表示图。

三、源程序

#include

#include

#define M 20

#define MAX 20

typedef struct

{

int begin;

int end;

int weight;

}edge;

typedef struct

{

int adj;

int weight;

}AdjMatrix[MAX][MAX];

typedef struct

{

AdjMatrix arc;

int vexnum, arcnum;

}MGraph;

void CreatGraph(MGraph *);

void sort(edge* ,MGraph *);

void MiniSpanTree(MGraph *);

int Find(int *, int );

void Swapn(edge *, int, int);

void CreatGraph(MGraph *G)

{

int i, j,n, m;

printf("请输入边数和顶点数:");

scanf("%d %d",&G->arcnum,&G->vexnum);

for (i = 1; i vexnum; i++)

{

for ( j = 1; j vexnum; j++)

{

G->arc[i][j].adj = G->arc[j][i].adj = 0;

}

}

for ( i = 1; i arcnum; i++)

{

printf("\n请输入有边的2个顶点");

scanf("%d %d",&n,&m);

while(n G->vexnum || m G->vexnum)

{

printf("输入的数字不符合要求 请重新输入:");

scanf("%d%d",&n,&m);

}

G->arc[n][m].adj = G->arc[m][n].adj = 1;

getchar();

printf("\n请输入%d与%d之间的权值:", n, m);

scanf("%d",&G->arc[n][m].weight);

}

printf("邻接矩阵为:\n");

for ( i = 1; i vexnum; i++)

{

for ( j = 1; j vexnum; j++)

{

printf("%d ",G->arc[i][j].adj);

}

printf("\n");

}

}

void sort(edge edges[],MGraph *G)

{

int i, j;

for ( i = 1; i arcnum; i++)

{

for ( j = i + 1; j arcnum; j++)

{

if (edges[i].weight > edges[j].weight)

{

Swapn(edges, i, j);

}

}

}

printf("权排序之后的为:\n");

for (i = 1; i arcnum; i++)

{

printf("> %d\n", edges[i].begin, edges[i].end, edges[i].weight); }

}

void Swapn(edge *edges,int i, int j)

{

int temp;

temp = edges[i].begin;

edges[i].begin = edges[j].begin;

edges[j].begin = temp;

temp = edges[i].end;

edges[i].end = edges[j].end;

edges[j].end = temp;

temp = edges[i].weight;

edges[i].weight = edges[j].weight;

edges[j].weight = temp;

}

void MiniSpanTree(MGraph *G)

{

int i, j, n, m;

int k = 1;

int parent[M];

edge edges[M];

for ( i = 1; i vexnum; i++)

{

for (j = i + 1; j vexnum; j++)

{

if (G->arc[i][j].adj == 1)

{

edges[k].begin = i;

edges[k].end = j;

edges[k].weight = G->arc[i][j].weight;

k++;

}

}

}

sort(edges, G);

for (i = 1; i arcnum; i++)

{

parent[i] = 0;

}

printf("最小生成树为:\n");

for (i = 1; i arcnum; i++)

{

n = Find(parent, edges[i].begin);

m = Find(parent, edges[i].end);

if (n != m)

{

parent[n] = m;

printf("> %d\n", edges[i].begin, edges[i].end, edges[i].weight); }

}

}

int Find(int *parent, int f)

{

while ( parent[f] > 0)

{

f = parent[f];

}

return f;

}

int main(void)

{

MGraph *G;

G = (MGraph*)malloc(sizeof(MGraph));

if (G == NULL)

{

printf("memory allcation failed,goodbye");

exit(1);

}

CreatGraph(G);

MiniSpanTree(G);

system("pause");

return 0;

}

四、运行结果

实验七 图的应用

——宋京松 [1**********]2

一、实验目的

1、使学生可以巩固所学的有关图的基本知识。

2、熟练掌握图的存储结构。

3、掌握如何应用图解决各种实际问题。

二、实验内容

本次实验提供2个题目,学生可以任选一个!

题目一:最小生成树问题

[问题描述]

若要在n 个城市之间建设通信网络,只需要假设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。

[基本要求]

1.利用克鲁斯卡尔算法求网的最小生成树。

2.要求输出各条边及它们的权值。

[实现提示]

通信线路一旦建成,必然是双向的。因此,构造最小生成树的网一定是无向网。设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数。

图的存储结构的选取应和所作操作相适应。为了便于选择权值最小的边,此题的存储结构既不选用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组表示图。

三、源程序

#include

#include

#define M 20

#define MAX 20

typedef struct

{

int begin;

int end;

int weight;

}edge;

typedef struct

{

int adj;

int weight;

}AdjMatrix[MAX][MAX];

typedef struct

{

AdjMatrix arc;

int vexnum, arcnum;

}MGraph;

void CreatGraph(MGraph *);

void sort(edge* ,MGraph *);

void MiniSpanTree(MGraph *);

int Find(int *, int );

void Swapn(edge *, int, int);

void CreatGraph(MGraph *G)

{

int i, j,n, m;

printf("请输入边数和顶点数:");

scanf("%d %d",&G->arcnum,&G->vexnum);

for (i = 1; i vexnum; i++)

{

for ( j = 1; j vexnum; j++)

{

G->arc[i][j].adj = G->arc[j][i].adj = 0;

}

}

for ( i = 1; i arcnum; i++)

{

printf("\n请输入有边的2个顶点");

scanf("%d %d",&n,&m);

while(n G->vexnum || m G->vexnum)

{

printf("输入的数字不符合要求 请重新输入:");

scanf("%d%d",&n,&m);

}

G->arc[n][m].adj = G->arc[m][n].adj = 1;

getchar();

printf("\n请输入%d与%d之间的权值:", n, m);

scanf("%d",&G->arc[n][m].weight);

}

printf("邻接矩阵为:\n");

for ( i = 1; i vexnum; i++)

{

for ( j = 1; j vexnum; j++)

{

printf("%d ",G->arc[i][j].adj);

}

printf("\n");

}

}

void sort(edge edges[],MGraph *G)

{

int i, j;

for ( i = 1; i arcnum; i++)

{

for ( j = i + 1; j arcnum; j++)

{

if (edges[i].weight > edges[j].weight)

{

Swapn(edges, i, j);

}

}

}

printf("权排序之后的为:\n");

for (i = 1; i arcnum; i++)

{

printf("> %d\n", edges[i].begin, edges[i].end, edges[i].weight); }

}

void Swapn(edge *edges,int i, int j)

{

int temp;

temp = edges[i].begin;

edges[i].begin = edges[j].begin;

edges[j].begin = temp;

temp = edges[i].end;

edges[i].end = edges[j].end;

edges[j].end = temp;

temp = edges[i].weight;

edges[i].weight = edges[j].weight;

edges[j].weight = temp;

}

void MiniSpanTree(MGraph *G)

{

int i, j, n, m;

int k = 1;

int parent[M];

edge edges[M];

for ( i = 1; i vexnum; i++)

{

for (j = i + 1; j vexnum; j++)

{

if (G->arc[i][j].adj == 1)

{

edges[k].begin = i;

edges[k].end = j;

edges[k].weight = G->arc[i][j].weight;

k++;

}

}

}

sort(edges, G);

for (i = 1; i arcnum; i++)

{

parent[i] = 0;

}

printf("最小生成树为:\n");

for (i = 1; i arcnum; i++)

{

n = Find(parent, edges[i].begin);

m = Find(parent, edges[i].end);

if (n != m)

{

parent[n] = m;

printf("> %d\n", edges[i].begin, edges[i].end, edges[i].weight); }

}

}

int Find(int *parent, int f)

{

while ( parent[f] > 0)

{

f = parent[f];

}

return f;

}

int main(void)

{

MGraph *G;

G = (MGraph*)malloc(sizeof(MGraph));

if (G == NULL)

{

printf("memory allcation failed,goodbye");

exit(1);

}

CreatGraph(G);

MiniSpanTree(G);

system("pause");

return 0;

}

四、运行结果


相关文章

  • 应用统计学试验二报告模板研究生
  • 高级管理统计实验报告 一.实验目的 本实验是<高级管理统计>课程的实践环节,通过实验,对所学理论知识进行进一步理解.让学生能够应用SPSS软件有效提高学生的数据处理能力,使学生掌握研究群体现象的基本方法,获得处理实际管理问题的本 ...查看


  • 统计软件应用实验报告
  • 实践报告书写要求 实践报告原则上要求学生手写,要求书写工整.若因课程特点需打印的,要遵照以下字体.字号.间距等的具体要求.纸张一律采用A4的纸张. 实践报告书写说明 实践报告中一至四项内容为必填项,包括实践目的和要求:实践环境与条件:实践内 ...查看


  • xml教学方案设计说明书
  • <XML基础>教学方案设计说明书 一. 课程培养目标 课时:32学时,理论24学时,实践8学时 学分:2 开课情况:09级计算机科学与技术专业第一次开课,主讲:李兴远,教材选用清华大学孙更新主编的<XML编程与应用教程&g ...查看


  • 计算机网络实验报告1网线的制作和应用
  • 电子信息学院 实验报告书 课 程 名 : 题 目: 计算机网络实验 1 网线的制作和应用 [验证] BX1213 [1**********]1 翟亚鹏 实验类别 班 学 姓 级: 号: 名: 评语: 实验态度:认真( ) 实验结果:正确( ...查看


  • 人机工程学实验报告
  • 人机工程学实验报告 Hust 工业设计专业,人机工程课程实验报告 必做实验( 必做实验(7 个) : 一.镜画仪: 镜画仪: 是一项目动作技能迁移的实验.因通过镜子反射,和原图形相比镜中 图像是上下倒置而左右不变. 实验一 错误次数 实验者 ...查看


  • 手持技术在酸碱中和滴定中的应用实验报告
  • 大学实验报告 学生姓名 学 号 专 业 年级.班级 课程名称 实验项目手持技术在酸碱滴定中的应用 实验类型 □验证□设计□综合 实验时间2012 年 月 日 实验指导老师 实验评分 [实验问题提出] 中学阶段主要采用酸碱指示剂来确定滴定终点 ...查看


  • 实验室信息管理系统(LIMS)
  • 1. 实验室信息管理系统(LIMS )主要功能 1)样品的管理(Sample Management) 是指样品进入实验室到分配检测项目直至完成并认可检测结果出具证书的过程.样品被登录到 LIMS 后,系统将严格按照预先定义好的有关规范对其实 ...查看


  • 微机原理及应用上机实验报告2数据传送
  • 实验报告 课程名称:_________微机原理及应用___________指导老师:_____钟崴_______成绩:__________________ 实验名称:_________数据传送___________实验类型:________ ...查看


  • 课程教学实施计划
  • 编写 审批 解放军理工大学指挥信息系统学院 教 学 实 施 教员姓名: 陈鸣,许博 单 位: 网络工程教研中心 课程名称: 计算机网络原理 授课对象: 本科学员 授课学期: 2013年春季学期 理工大学训练部制表 课 程计 划 2012学年 ...查看


  • 会计信息系统实验报告总结
  • 篇一:u8 会计信息系统 金蝶 实验报告 心得体会 学 生 实 践 报 告 课程名称: 学生学号: 所属院部: (文科类) 会计信息系统 专业班级: 09会计学(3) 0901101087 商学院 指导教师: 郁露露 20 11 --20 ...查看


热门内容