当前位置: 首页 > news >正文

贪心算法《最短路径》

题目大意:

      存在几个城市1~n;每个城市任意连向其他城市。并且,路程也是不尽相同的。若从一个城市出发,去各个城市,则去各个城市每一个城市的最短路程计算出来。

如下是几个城市的地图:

题目分析:一个城市可能有多个路径,但是寻找最小的路径却不容易。

算法:贪心算法:从1城市出发,到达4和5城市最小路径的充分必要条件是到达前面每一个城市都是最短路径——及贪心算法中局部最优解,构成全局最优解

数据结构:用map[][]这样的矩阵记录每个城市的路的大小。dist[]记录每个城市的最短路程。p[]记录前一个城市,这样就能找到全部路线。flag[]记录

每个城市是否找到最短的路程。免得重复查找。

 

1.初始化部分

void init(int map[][Max], int dist[], int p[], bool flag[])
{
 cin >> n;
 for (int i = 0; i <= n; i++)
 {
  p[i] = -1;
  flag[i] = false;  //当flag为假时,则还不为最短路程
  dist[i] = Maxnum;
  for (int j = 0; j <= n; j++)
  {
   map[i][j] = Maxnum;
  }
 }
 //操作
 p[1] = 0;
 dist[1] = 0;
 map[1][1] = 0;
 flag[1] = true;
}

将map[][]内全部初始化为极大的数

注意:在这里先让1城市带入了。

2.输入块儿

void cinfun(int map[][Max], int dist[], int p[], bool flag[])
{
 cin >> m;
 //数据的输入
 int num = m;
 while (num--)
 {
  int u, k, l;
  cin >> u >> k >> l;
  map[u][k] = l;
 }
}

3.寻找在flag[]为假中dist[]的最小的城市。并,找到与他相连的城市。比较相连城市的目前的dist[]去该城市的dist[]加上这两个城市的距离。

若小,则说明走该城市到相连城市是更短的路径。(核心!!!!)

void minfun(int map[][Max], int dist[], int p[], bool flag[])
{
 for (int i = 2; i <= n; i++)
 {
  if (dist[i] > map[1][i])
  {
   dist[i] = map[1][i];
   p[i] = 1;
  }
 }
 m--;
 while (m--)
 {
  //算法:在V_S中寻找最小路径x。
  int min = 0;
  for (int i = 1; i <= n; i++)
  {
   if (dist[i] < dist[min]&&!flag[i]) min = i;
  }
  //通过dis[k]>dist[x]+map[x][k]时改变该路程
  for (int i = 1; i <= n; i++)
  {
   if (!flag[i])
   {
    if (map[min][i] != Maxnum)
    {
     if (dist[i] > dist[min] + map[min][i])
     {
      dist[i] = dist[min] + map[min][i];
      p[i] = min;
     }
    }
   }
  }
  flag[min] = true;
 }
}

 

代码如下:

#include<iostream>
using namespace std;
//数据结构Map记录路线情况,
//dist[]记录最短路径,
//q[]记录前驱,
//flag[]记录是否为已经是最短路径
#define Max 100
#define Maxnum 1000
int map[Max][Max];
int dist[Max], p[Max];
bool flag[Max];
int n;
int m;
void init(int map[][Max], int dist[], int p[], bool flag[]);
void cinfun(int map[][Max], int dist[], int p[], bool flag[]);
void minfun(int map[][Max], int dist[], int p[], bool flag[]);
int main()
{
 //初始化
 init(map, dist, p, flag);
 //输入数据
 cinfun(map, dist, p, flag);
 //最小值
 minfun(map, dist, p, flag);
 for (int i = 1; i <= n; i++)
 {
  cout << "城市:" << i << "前一个城市:" << p[i] << endl;
  cout << "最短路程是:" << dist[i] << endl << endl;
 }
 return 0;
}

void init(int map[][Max], int dist[], int p[], bool flag[])
{
 cin >> n;
 for (int i = 0; i <= n; i++)
 {
  p[i] = -1;
  flag[i] = false;  //当flag为假时,则还不为最短路程
  dist[i] = Maxnum;
  for (int j = 0; j <= n; j++)
  {
   map[i][j] = Maxnum;
  }
 }
 //操作
 p[1] = 0;
 dist[1] = 0;
 map[1][1] = 0;
 flag[1] = true;
}
void cinfun(int map[][Max], int dist[], int p[], bool flag[])
{
 cin >> m;
 //数据的输入
 int num = m;
 while (num--)
 {
  int u, k, l;
  cin >> u >> k >> l;
  map[u][k] = l;
 }
}

void minfun(int map[][Max], int dist[], int p[], bool flag[])
{
 for (int i = 2; i <= n; i++)
 {
  if (dist[i] > map[1][i])
  {
   dist[i] = map[1][i];
   p[i] = 1;
  }
 }
 m--;
 while (m--)
 {
  //算法:在V_S中寻找最小路径x。
  int min = 0;
  for (int i = 1; i <= n; i++)
  {
   if (dist[i] < dist[min]&&!flag[i]) min = i;
  }
  //通过dis[k]>dist[x]+map[x][k]时改变该路程
  for (int i = 1; i <= n; i++)
  {
   if (!flag[i])
   {
    if (map[min][i] != Maxnum)
    {
     if (dist[i] > dist[min] + map[min][i])
     {
      dist[i] = dist[min] + map[min][i];
      p[i] = min;
     }
    }
   }
  }
  flag[min] = true;
 }
}

 

转载于:https://www.cnblogs.com/damaoranran/p/8617695.html

相关文章:

  • javascript 封装一个class选择器
  • ubuntu 环境下的QT程序打包
  • dom4j解析xml
  • sublime text less安装踩坑图文讲解(less无法生成css)
  • PHP中遍历关联数组的方法
  • opencv再学习之路(五)---灰度直方图显示
  • 在windows2003上部署MVC4.0需要具备的环境
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • ContentProvider介绍
  • 10.19 iptables规则备份和恢复10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作...
  • C# 屏幕监控 自动截屏程序 主窗体隐藏,仅在进程中显示
  • 手机加载优化 - 2x、3x图
  • 清明小感
  • [win7-oracle处理方法]--java.lang.Exception: Exception in sending Request :: null(转)
  • 0323-方法(函数)
  • 《Java编程思想》读书笔记-对象导论
  • Apache Pulsar 2.1 重磅发布
  • git 常用命令
  • JavaScript实现分页效果
  • JS变量作用域
  • Laravel Mix运行时关于es2015报错解决方案
  • leetcode46 Permutation 排列组合
  • nodejs实现webservice问题总结
  • passportjs 源码分析
  • Python学习笔记 字符串拼接
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Redis 懒删除(lazy free)简史
  • vue的全局变量和全局拦截请求器
  • 测试开发系类之接口自动化测试
  • 给初学者:JavaScript 中数组操作注意点
  • 聊聊redis的数据结构的应用
  • 如何设计一个比特币钱包服务
  • 跳前端坑前,先看看这个!!
  • kubernetes资源对象--ingress
  • raise 与 raise ... from 的区别
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • # Maven错误Error executing Maven
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $$$$GB2312-80区位编码表$$$$
  • $forceUpdate()函数
  • (1)(1.11) SiK Radio v2(一)
  • (Git) gitignore基础使用
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (利用IDEA+Maven)定制属于自己的jar包
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net 设置默认首页
  • .NET设计模式(11):组合模式(Composite Pattern)
  • ::前边啥也没有
  • ?php echo ?,?php echo Hello world!;?
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [bzoj 3534][Sdoi2014] 重建
  • [CF407E]k-d-sequence
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)