【问题描述】
给定n个村庄之间的交通图。若村庄i与村庄j之间有路可通,则将顶点i与顶点j之间用边连接,边上的权值wij表示这条道路的长度。现打算在这n个村庄中选定一个村庄建一所医院,设计一个算法求出该医院应建在哪一个村庄能使各村庄的总体交通代价最最少
【输入形式】
第一行顶点个数n,边的个数。第二行到n+1行邻接矩阵
【输出形式】
村庄的编号,从0开始
【样例输入】
5 10
0 13 32767 4 32767
13 0 15 32767 5
32767 32767 0 12 32767
4 32767 12 0 32767
32767 32767 6 3 0
【样例输出】
3
【样例说明】
32767表示两个顶点不连接,是∞
【评分标准】
#include<iostream>
#include<vector>
using namespace std;
const int MAX = 32767;
class FLoyd {
private:
struct rectangle {
int** d;
rectangle(int z) {
d = new int* [z+1];
for (int i = 0; i <= z; i++) {
d[i] = new int[z+1];
for (int j = 0; j <= z; j++) {
d[i][j] = MAX;
}
}
}
};
int vexnum=0;
int arcnum=0;
vector<rectangle>D;
public:
void create();
void floyd();
};
void FLoyd::create()
{
cin >> vexnum >> arcnum;
for (int i = 0; i <= vexnum; i++) {
rectangle g = rectangle(vexnum);
D.push_back(g);
}
int z;
for (int i = 1; i <= vexnum; i++)
for (int j = 1; j <= vexnum; j++) {
cin >> z;
if (z != MAX)D[0].d[i][j] = z;
}
}
void FLoyd::floyd()
{
for (int i = 1; i <= vexnum; i++) {
for (int m = 1; m <= vexnum; m++)
for (int n = 1; n <= vexnum; n++)
D[i].d[m][n] = D[i-1].d[m][n];
for (int j = 1; j <= vexnum; j++)
for (int k = 1; k <= vexnum; k++) {
if (j != k) {
D[i].d[j][k] = min(D[i-1].d[j][k], D[i].d[j][i] + D[i-1].d[i][k]);
}
}
}
int z = 0;
int x = 99;
int y;
for (int i = 1; i <= vexnum; i++) {
for (int j = 1; j <= vexnum; j++) {
z += D[vexnum].d[i][j];
z += D[vexnum].d[j][i];
}
if (i == 1)y = z;
if (z < y) {
y = z;
x = i;
}
z = 0;
}
cout<<x - 1;
}
int main() {
FLoyd f;
f.create();
f.floyd();
}