#include <iostream>
using namespace std;
template <class ElemType>
struct graph
{
int vexnum;
int arcnum;
ElemType *vex;
int **AdjMatrix;
};
template <class ElemType>
void CreateUDN(graph<ElemType> &G)
{
cout << "输入图的顶点数和边数:" << endl;
cin >> G.vexnum >> G.arcnum;
ElemType v1,v2;
int i,j,m,n,weight;
G.vex = (ElemType *)malloc(G.vexnum * sizeof(ElemType));
G.AdjMatrix = (int **)malloc(G.vexnum * sizeof(int *));
for(i = 0;i < G.vexnum;i++)
G.AdjMatrix[i] = (int *)malloc(G.vexnum * sizeof(int));
for(i = 0;i < G.vexnum;i++)
for(j = 0;j < G.vexnum;j++)
G.AdjMatrix[i][j] = INT_MAX;
cout << "输入各顶点表示的含义(字母与数字均可):" << endl;
for(i = 0;i < G.vexnum;i++)
cin >> G.vex[i];
cout << "输入无向图各条边依附的两点及权值:" << endl;
for(i = 0;i < G.arcnum;i++)
{
cin >> v1 >> v2 >> weight;
for(j = 0;j < G.vexnum;j++)
{
if(v1 == G.vex[j]) m = j;
if(v2 == G.vex[j]) n = j;
}
G.AdjMatrix[m][n] = G.AdjMatrix[n][m] = weight;
}
}
template <class ElemType>
int * Shortestpath_DIJ(graph<ElemType> G,int v)
{
int *path = (int *)malloc(G.vexnum * sizeof(int));
bool *visited = (bool *)malloc(G.vexnum * sizeof(bool));
int i,j,k,min;
for(i = 0;i < G.vexnum;i++)
{
path[i] = G.AdjMatrix[v][i];
visited[i] = false;
}
path[v] = 0;visited[v] = true;
for(i = 1;i < G.vexnum;i++)
{
min = INT_MAX;
for(j = 0;j < G.vexnum;j++)
if(!visited[j] && path[j] < min)
{
min = path[j];
k = j;
}
visited[k] = true;
for(j = 0;j < G.vexnum;j++)
if(!visited[j] && G.AdjMatrix[k][j] < INT_MAX && path[k] + G.AdjMatrix[k][j] < path[j])
path[j] = path[k] + G.AdjMatrix[k][j];
}
free(visited);
return path;
}
template <class ElemType>
void Solveplan(graph<ElemType> G)
{
CreateUDN(G);
int i,j,k,min;
int **path = (int **)malloc(G.vexnum * sizeof(int *));
int *max = (int *)malloc(G.vexnum * sizeof(int));
for(i = 0;i < G.vexnum;i++)
path[i] = (int *)malloc(G.vexnum * sizeof(int));
for(i = 0;i < G.vexnum;i++)
{
path[i] = Shortestpath_DIJ(G,i);
max[i] = 0;
for(j = 0;j < G.vexnum;j++)
if(path[i][j] > max[i]) max[i] = path[i][j];
}
min = INT_MAX;
for(i = 0;i < G.vexnum;i++)
if(max[i] < min)
{min = max[i];k = i;}
cout << "医院建在" << G.vex[k] << "处符合题意!" << endl;
cout << "医院到各村庄的最短路径如下:" << endl;
for(i = 0;i < G.vexnum;i++)
if(i != k)
cout << G.vex[k] << "->" << G.vex[i] << " " << path[k][i] << endl;
for(i = 0;i < G.vexnum;i++)
free(path[i]);
free(path);
free(max);
}
int main()
{
graph<char> G;
Solveplan(G);
return 0;
}