为新建医院选址

来源:互联网 发布:购买域名的常用运营商 编辑:程序博客网 时间:2024/04/30 02:11

 

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 dsn服务器未响应怎么办 发生骚乱时应该怎么办 车载一体机音质差怎么办 富士康smt上错料怎么办 语音清唱太难听怎么办 酷狗里找不到的歌怎么办 iphone6话筒坏了怎么办 iphone听筒坏了怎么办 iphone话筒坏了怎么办 115邮箱无法登陆怎么办 群超时无法撤回怎么办 被加州大学撤回录取怎么办 ppt转码失败怎么办 苹果xicloud满了怎么办 小米note3不充电怎么办 网易云海外会员怎么办 百度云支付失败怎么办 信用卡输入密码错误怎么办 相机储存卡被锁怎么办 sd卡检测不到怎么办 手机图标闪退怎么办 电视看爱奇艺版权受限怎么办 王者荣耀重复id怎么办 拼多多资源位下架怎么办 百度云网络异常怎么办 公开课没上好怎么办 ios云备份失败怎么办 网易云登录异常怎么办? 阴阳师网易账号冻结怎么办 梦幻账号被冻结怎么办 手机忘记解锁密码怎么办 胃疼持续一天怎么办 胃痛一天一夜怎么办 孩子爱玩电脑怎么办 ipad不显示画面怎么办 正版win10换电脑怎么办 电脑系统不是正版怎么办 苹果平板进水了怎么办 华为平板进水了怎么办 三星平板进水了怎么办 笔记本cpu运行过高怎么办