求城门个数

简介: 求城门个数
/算法思想:①根据城市的半径从小到大排序。
//②将城市设为图的顶点,与最接近的外围城市的边设为1。
//③用迪杰斯特拉算法找出两个城市最短路径。
typedef struct city {
  int x;
  int y;
  int r;
  char name;
};
int Dijkstra(int v1,int v2, vector<vector<int>> graph,int n) {
  int i, j, k, min;
  vector<int> d(n,0);
  vector<bool>visit(n,false);
  for (int i = 0; i < n; i++) {
    d[i] = graph[v1][i];
  }
  visit[v1] = true;
  for (int i = 0; i < n; i++) {
    min = 1e9;
    for (int j = 0; j < n; j++) {
      if (d[j] < min && visit[j] == false) {
        min = d[j];
        k = j;
      }
    }
    visit[k] = true;
    for (int j = 0; j < n; j++) {
      if (d[k] + graph[k][j] < d[j]) {
        d[j] = d[k] + graph[k][j];
      }
    }
  }
  return d[v2];
}
bool comp(city a, city b) {
  return a.r < b.r;
}
void mindoor() {
  cout << "请输入城市个数" << endl;
  int n;//城市个数
  int x;
  int y;
  int r;
  char name;
  cin >> n;
  vector<city> citys;
  vector<vector<int>> graph(n,vector<int>(n,100));
  for (int i = 0; i < n; i++) {
    city c;
    cout << "请输入城市名称" << endl;
    cin >> name;
    c.name = name;
    cout << "请输入城市坐标"<<endl;
    cin >> x;
    cin >> y;
    c.x = x;
    c.y = y;
    cout << "请输入城市半径" << endl;
    cin >> r;
    c.r = r;
    citys.push_back(c);
  }
  sort(citys.begin(), citys.end(),comp);
  for (int i = 0; i < n; i++) {
    for (int j = i+1; j < n; j++) {
      int x1 = citys[i].x;
      int y1 = citys[i].y;
      int x2 = citys[j].x;
      int y2 = citys[j].y;
      int r1 = citys[i].r;
      int r2 = citys[j].r;
      int d = pow(pow(x1 - x2, 2) + pow(y1 - y2, 2), 0.5);
      if (d < r2 - r1) {
        graph[i][j] = 1;
        graph[j][i] = 1;
        break;
      }
    }
  }
  cout << "输入查找城市" << endl;
  char c1;
  char c2;
  cin >>c1;
  cin >>c2;
  int v1 = 0;
  int v2 = 0;
  for (int i = 0; i < n;i++) {
    if (citys[i].name == c1) {
      v1 = i;
    }
  }
  for (int i = 0; i < n; i++) {
    if (citys[i].name == c2) {
      v2 = i;
    }
  }
  cout << endl;
  cout << "门个数为:" << Dijkstra(v1, v2, graph, n);
}
int main() {
  mindoor();
}
相关文章
|
编译器 Go 开发者
Golang 语言怎么使用接口编程?
Golang 语言怎么使用接口编程?
128 0
|
8月前
|
机器学习/深度学习 算法
算法系列之搜索算法-深度优先搜索DFS
深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜索,直到到达顶点。深度优先搜索会沿着一条路径不断的往下搜索,直到不能够在继续为止,然后在折返,开始搜索下一条候补路径。
553 62
算法系列之搜索算法-深度优先搜索DFS
|
Ubuntu Shell Linux
shell配置以及安装
shell配置以及安装
300 2
|
编译器 C++ 容器
【C++】list的使用(上)
迭代器在STL中统一了访问接口,如`list`的`begin()`和`end()`。示例展示了如何使用正向和反向迭代器遍历`list`。注意`list`的迭代器不支持加减操作,只能用`++`和`--`。容器的`empty()`和`size()`用于检查状态和获取元素数。`front()`和`back()`访问首尾元素,`assign()`重载函数用于替换内容,`push_*/pop_*`管理两端元素,`insert()`插入元素,`erase()`删除元素,`resize()`调整大小,`clear()`清空容器。这些接口与`vector`和`string`类似,方便使用。
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的线上医院挂号系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的线上医院挂号系统附带文章源码部署视频讲解等
95 1
|
Android开发 iOS开发 Windows
AppsFlyer 研究(十三)SRN平台对接-Google Adwords对接配置
AppsFlyer 研究(十三)SRN平台对接-Google Adwords对接配置
288 0
AppsFlyer 研究(十三)SRN平台对接-Google Adwords对接配置
从零开始学习 Java:简单易懂的入门指南之JDK8时间相关类(十八)
从零开始学习 Java:简单易懂的入门指南之JDK8时间相关类(十八)
|
机器学习/深度学习 计算机视觉 网络架构
有手就行?把大象P转身只需拖动鼠标,华人一作DragGAN爆火(1)
有手就行?把大象P转身只需拖动鼠标,华人一作DragGAN爆火
291 0
|
关系型数据库 MySQL 数据库
【MySQL】 | 事务隔离,温故而知新
在实际的功能中,我们为了解决数据安全操作的问题,事务用大白话来说,就是要么全部成功,要么全部失败,对于隔离级别对应的业务场景,我们又有多少的了解呢,接下来开始我们的学习。
|
存储 缓存 移动开发
常见 APP 风险检测|学习笔记
快速学习常见 APP 风险检测
202 0
常见 APP 风险检测|学习笔记