为新建医院选址

 

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值