数据结构图的综合实验代码
2010-12-13 14:54
351 查看
实验指导书(也就是实验题目)在这里:
http://lab.xcoder.in/xdisk/file-7.html
第15、16的代码(先贴代码,再解析。)
Code:
#include <iostream>
#include <cstring>
using namespace std;
#define MAXV 50
#define INF 2147483647
#define MIN(a, b) ((a < b && -1 != a) ? a : b)
#define MAX(a, b) ((a > b && -1 != b) ? a : b)
struct Graph {
int dis[MAXV][MAXV];
int e, v;
};
struct Cost {
int num, cost;
};
const Graph G = {
{
{ 0, 5, 8, 7, -1, 3 },
{ 5, 0, 4, -1, -1, -1 },
{ 8, 4, 0, 5, -1, 9 },
{ 7, -1, 5, 0, 5, 6 },
{ -1, -1, -1, 5, 0, 1 },
{ 3, -1, 9, 6, 1, 0 }
},
20,
6
};
Graph NewG;
/** 输出矩阵 */
void OutputMatrix(const Graph G)
{
printf("输出矩阵:/n");
for(int i = 0; i < G.v; i++)
{
for(int j = 0; j < G.v; j++)
printf("%4d", G.dis[i][j]);
printf("/n");
}
}
/** 普利姆算法函数 */
int Prim(Graph G, int v)
{
Cost lowcost[MAXV];
int min;
int i, j, k;
int ans = 0;
/** 初始化 */
for(i = 0; i < G.v; i++)
{
lowcost[i].cost = G.dis[v][i];
lowcost[i].num = v;
}
printf("根结点为%d./n", v);
/** 开始Prim循环 */
for(i = 0; i < G.v - 1; i++)
{
min = INF; ///< 设定min初始值为正无穷
k = -1; ///< 设定min所对应的下标k初始值为-1
for(j = 0; j < G.v; j++) ///< 循环寻找剩下结点到这棵树的最小权值
{
if(lowcost[j].cost > 0 && lowcost[j].cost < min)
{
min = lowcost[j].cost;
k = j;
}
}
/** 加入新结点 */
printf("加入结点%d, 父结点为%d, 权值为%d./n", k, lowcost[k].num, lowcost[k].cost);
ans += lowcost[k].cost;
lowcost[k].cost = 0;
/** 循环更新剩下各结点到新树的距离 */
for(j = 0; j < G.v; j++)
{
if(G.dis[j][k] && lowcost[j].cost
&& ((-1 != G.dis[j][k] && lowcost[j].cost > G.dis[j][k])
|| -1 == lowcost[j].cost))
{
lowcost[j].cost = G.dis[j][k];
lowcost[j].num = k;
}
}
}
return ans;
}
void Floyd(Graph G)
{
int dis[MAXV][MAXV], maxd[MAXV], tot[MAXV], minc = 0, mint = 0;
memcpy(dis, G.dis, sizeof(dis));
memset(maxd, 0, sizeof(maxd));
memset(tot, 0, sizeof(tot));
int i, j, k;
/** 弗洛伊德求各结点到其它各结点的最短路 */
for(i = 0; i < G.v; i++)
for(j = 0; j < G.v; j++)
for(k = 0; k < G.v; k++)
if(i != j && i != k && j != k && -1 != dis[i][k] && -1 != dis[k][j])
dis[i][j] = MIN(dis[i][j], dis[i][k] + dis[k][j]);
/** 求答案 */
for(i = 0; i < G.v; i++)
{
for(j = 0; j < G.v; j++)
if(i != j)
{
maxd[i] = MAX(maxd[i], dis[i][j]);
if(-1 != dis[i][j] && INF != tot[i]) tot[i] += dis[i][j];
else tot[i] = INF;
}
//printf("maxd[%d] = %d;/n", i, maxd[i]);
//printf("tot[%d] = %d;/n", i, tot[i]);
if(maxd[i] < maxd[minc]) minc = i;
if(tot[i] < tot[mint]) mint = i;
}
printf("将医院建在结点%d时, 使最远村庄到医院的距离最近, 距离为%d./n", minc, maxd[minc]);
printf("将医院建在结点%d时, 是总距离最近, 距离为%d./n", mint, tot[mint]);
}
int main()
{
OutputMatrix(G);
printf("/n");
NewG = G;
printf("开始最小生成树:/n");
printf("最小生成树权值为: %d./n", Prim(NewG, 0));
printf("/n");
NewG = G;
printf("开始求最短路径:/n");
Floyd(NewG);
return 0;
}
http://lab.xcoder.in/xdisk/file-7.html
第15、16的代码(先贴代码,再解析。)
Code:
#include <iostream>
#include <cstring>
using namespace std;
#define MAXV 50
#define INF 2147483647
#define MIN(a, b) ((a < b && -1 != a) ? a : b)
#define MAX(a, b) ((a > b && -1 != b) ? a : b)
struct Graph {
int dis[MAXV][MAXV];
int e, v;
};
struct Cost {
int num, cost;
};
const Graph G = {
{
{ 0, 5, 8, 7, -1, 3 },
{ 5, 0, 4, -1, -1, -1 },
{ 8, 4, 0, 5, -1, 9 },
{ 7, -1, 5, 0, 5, 6 },
{ -1, -1, -1, 5, 0, 1 },
{ 3, -1, 9, 6, 1, 0 }
},
20,
6
};
Graph NewG;
/** 输出矩阵 */
void OutputMatrix(const Graph G)
{
printf("输出矩阵:/n");
for(int i = 0; i < G.v; i++)
{
for(int j = 0; j < G.v; j++)
printf("%4d", G.dis[i][j]);
printf("/n");
}
}
/** 普利姆算法函数 */
int Prim(Graph G, int v)
{
Cost lowcost[MAXV];
int min;
int i, j, k;
int ans = 0;
/** 初始化 */
for(i = 0; i < G.v; i++)
{
lowcost[i].cost = G.dis[v][i];
lowcost[i].num = v;
}
printf("根结点为%d./n", v);
/** 开始Prim循环 */
for(i = 0; i < G.v - 1; i++)
{
min = INF; ///< 设定min初始值为正无穷
k = -1; ///< 设定min所对应的下标k初始值为-1
for(j = 0; j < G.v; j++) ///< 循环寻找剩下结点到这棵树的最小权值
{
if(lowcost[j].cost > 0 && lowcost[j].cost < min)
{
min = lowcost[j].cost;
k = j;
}
}
/** 加入新结点 */
printf("加入结点%d, 父结点为%d, 权值为%d./n", k, lowcost[k].num, lowcost[k].cost);
ans += lowcost[k].cost;
lowcost[k].cost = 0;
/** 循环更新剩下各结点到新树的距离 */
for(j = 0; j < G.v; j++)
{
if(G.dis[j][k] && lowcost[j].cost
&& ((-1 != G.dis[j][k] && lowcost[j].cost > G.dis[j][k])
|| -1 == lowcost[j].cost))
{
lowcost[j].cost = G.dis[j][k];
lowcost[j].num = k;
}
}
}
return ans;
}
void Floyd(Graph G)
{
int dis[MAXV][MAXV], maxd[MAXV], tot[MAXV], minc = 0, mint = 0;
memcpy(dis, G.dis, sizeof(dis));
memset(maxd, 0, sizeof(maxd));
memset(tot, 0, sizeof(tot));
int i, j, k;
/** 弗洛伊德求各结点到其它各结点的最短路 */
for(i = 0; i < G.v; i++)
for(j = 0; j < G.v; j++)
for(k = 0; k < G.v; k++)
if(i != j && i != k && j != k && -1 != dis[i][k] && -1 != dis[k][j])
dis[i][j] = MIN(dis[i][j], dis[i][k] + dis[k][j]);
/** 求答案 */
for(i = 0; i < G.v; i++)
{
for(j = 0; j < G.v; j++)
if(i != j)
{
maxd[i] = MAX(maxd[i], dis[i][j]);
if(-1 != dis[i][j] && INF != tot[i]) tot[i] += dis[i][j];
else tot[i] = INF;
}
//printf("maxd[%d] = %d;/n", i, maxd[i]);
//printf("tot[%d] = %d;/n", i, tot[i]);
if(maxd[i] < maxd[minc]) minc = i;
if(tot[i] < tot[mint]) mint = i;
}
printf("将医院建在结点%d时, 使最远村庄到医院的距离最近, 距离为%d./n", minc, maxd[minc]);
printf("将医院建在结点%d时, 是总距离最近, 距离为%d./n", mint, tot[mint]);
}
int main()
{
OutputMatrix(G);
printf("/n");
NewG = G;
printf("开始最小生成树:/n");
printf("最小生成树权值为: %d./n", Prim(NewG, 0));
printf("/n");
NewG = G;
printf("开始求最短路径:/n");
Floyd(NewG);
return 0;
}
相关文章推荐
- 信管16数据结构:实验二 线性表综合实验
- 数据结构:实验二线性表综合实践⑤间接寻址
- 实验五 数据结构综合应用 20162305
- 数据结构实验B树的C++代码实现
- 数据结构中,二叉树用到的算法代码综合
- 数据结构实验之排序五:归并求逆序数
- 3402 数据结构实验之排序五:归并求逆序数
- 数据结构实验之排序六:希尔排序
- 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树二:遍历二叉树
- 数据结构实验之查找一:二叉排序树
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之查找五:平方之哈希表
- 数据结构实验之排序五:归并求逆序数
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 1479-数据结构实验之栈与队列九:行编辑器
- 数据结构与算法学习笔记之写链表代码的正确姿势(下)
- 数据结构实验之查找三:树的种类统计
- 数据结构实验之链表七:单链表中重复元素的删除
- SDUTACM 数据结构实验之排序三:bucket sort