图片已省略,哈哈哈
计算机网络要求网络中的计算机被连接起来,本问题考虑一个“线性”的网络,在这一网络中计算机被连接到一起,并且除了首尾的两台计算机只分别连接着一台计算机外,其它任意一台计算机恰连接着两台计算机。图2中用圆点表示计算机,它们的位置用直角坐标表示。网络连接的计算机之间的距离单位为英尺。
由于很多原因,我们希望使用的电缆长度应可能地短。你的问题是去决定计算机应如何被连接以使你所使用的电缆长度最短。在设计方案施工时,电缆将埋在地下,因此连接两台计算机所要用的电缆总长度等于计算机之间的距离加上额外的16英尺电缆,以从地下连接到计算机,并为施工留一些余量。
图3是计算机的最优连接方案,这样一个方案用电缆的总长度是
(4 + 16) + (5 + 16) + (5.38 + 16) +(11.18 + 16) = 90.01英尺
图3 最优连接方案示意图
要求:
(1)基本要求:
输入网络中的计算机总数和每台计算机的坐标。
输出使电缆长度最短的连接方案。给出最优连接方案中每两台相邻计算机之间的距离,以及总的电缆长度。
(2)提高要求:
参考图2、图3,用图形化的方式显示结果,包括点的坐标、最优路径、相邻计算机之间的距离。
#include<iostream>
#include<string>
using namespace std;
typedef char VertexType; //顶点类型应由用户定义
typedef int EdgeType; //边上的权值类型应由用户定义
#define MAXVEX 100 //最大顶点数,应由用户定义
#define DEBUG
//邻接矩阵结构
typedef struct
{
double arc[MAXVEX][MAXVEX]; //邻接矩阵,可看作边
int numVertexes; //图中当前的顶点数和边数
}Graph;
//
struct zuobiao {
double x;
double y;
};
zuobiao node[MAXVEX];
//定位
//建立一个无向网图的邻接矩阵表示
void CreateGraph(Graph *g)
{
int i, j;
double w;
printf("输入顶点数:\n");
cin >> g->numVertexes;
cout << "请输入顶点的坐标:";
for (i = 0; i < g->numVertexes; i++)
{
cin >>node[i].x >> node[i].y;
}
for (i = 0; i < g->numVertexes; i++)
{
for (j = 0; j < g->numVertexes; j++)
{
g->arc[i][j] = 65535.0; //邻接矩阵初始化
}
}
for (int m = 0; m < g->numVertexes; m++) {
for (int n = m+1; n < g->numVertexes; n++) {
w = sqrt(pow(node[m].x - node[n].x, 2) + pow(node[m].y - node[n].y, 2));
g->arc[m][n] = w;
g->arc[n][m] = g->arc[m][n];
}
}
}
//打印图,领接矩阵表示法
void printGraph(Graph g)
{
int i, j;
cout << "构建的邻接矩阵如下所示" << endl;
for (i = 0; i < g.numVertexes; i++)
{
for (j = 0; j < g.numVertexes; j++)
{
cout << g.arc[i][j] << "\t";
}
cout << endl;
}
}
//求解路径
void Path(Graph &g,int v, double len[MAXVEX], int n[MAXVEX][MAXVEX]) {
int k = 0;
int p = 0;
double m = g.arc[v][0];
n[v][k] = v;
bool visited[MAXVEX] = { false };
visited[v] = true;
int i = v;
int a = g.numVertexes - 1;
while (visited[i] == true && a >= 1) {
for (int j = 0; j < g.numVertexes; j++) {
if ((m > g.arc[i][j] || a == 1) && visited[j] == false) {
m = g.arc[i][j];
p = j;
}
}
k++;
n[v][k] = p;
visited[p] = true;
len[v] += m;
i = p;
m = 65535.0;
a--;
}
}
int code(double len[MAXVEX],Graph g) {
double min = len[0];
int n = 0;
for (int i = 0; i < g.numVertexes; i++) {
if (min > len[i]) {
min = len[i];
n = i;
}
}
return n;
}
void Print(Graph &g, double len[MAXVEX], int n[MAXVEX][MAXVEX]) {
int m = code(len, g);
for (int i = 0; i < g.numVertexes; i++) {
cout << "(" << node[n[m][i]].x << "," << node[n[m][i]].y << ")";
}
}
//求总长度
double Sum(double len[MAXVEX],Graph g) {
double m = len[code(len,g)];
return m + 16 * (g.numVertexes - 1);
}
int main(int argc, char **argv)
{
double len[MAXVEX] = { 0 };
int n[MAXVEX][MAXVEX];
Graph g;
CreateGraph(&g);
printGraph(g);
for (int v = 0; v < g.numVertexes; v++) {
Path(g, v, len, n);
}
for (int i = 0; i < g.numVertexes; i++)
{
for (int j = 0; j < g.numVertexes; j++)
{
cout << n[i][j] << " ";
}
cout << endl;
}
for (int k = 0; k < g.numVertexes; k++) {
cout << len[k] << " ";
}
Print(g,len,n);
cout << "总的电线长度为:" << Sum(len,g);
system("pause");
return 0;
}