您的位置:首页 > 理论基础 > 数据结构算法

数据结构图的综合实验代码

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: