旅游路线问题 线性规划网络流

旅游路线问题

在这里插入图片描述

#include <iostream>在这里插入图片描述#include <cstring>
#include <map>
#include <queue>
using namespace std;
using std::cout;
const int INF = 1000000;    //正无穷
const int NODESIZE = 100;   //结点最大个数
const int EDGESIZE = 10000; //最大边数
int top;                    //当前边下标
int maxflow;                //最大流最小费用
bool vis[NODESIZE];         //访问标记数组
int c[NODESIZE];            //入队次数
int dist[NODESIZE];         //dist[i]表示源点到点i最短距离:距离即这条路单位cost和
int pre[NODESIZE];          //前驱数组
string str[NODESIZE];
map<string, int> maze;struct Vertex
{              //邻接表头节点int first; //与之连接的边的序号
} V[NODESIZE];
struct Edge
{                //边表示int v, next; //v弧头 next指向下一条邻接边int cap, flow, cost;
} E[EDGESIZE];void init();                                  //初始化
void add(int u, int v, int c, int cost);      //更新混合网络
void add_edge(int u, int v, int c, int cost); //更新混合网络边
void printgraph(int n);                       //输出网络邻接表
void printflow(int n);                        //输出实流边
int MCMF(int s, int t, int n);                //最小花费最大流
bool SPFA(int s, int t, int n);               //求最小费用路
void print(int s, int t);int main(int argc, char **argv)
{int n, m, i;string str1, str2;cout << "输入景点个数n和直达路线数m:\n";cin >> n >> m;init();maze.clear();cout << "输入景点名字\n";for (i = 1; i <= n; i++){cin >> str[i];maze[str[i]] = i;if (i == 1 || i == n){add(i, i + n, 2, 0);}else{add(i, i + n, 1, 0);}}cout << "输入可以直达的两个景点名\n";for (i = 1; i <= m; i++){cin >> str1 >> str2;int a = maze[str1], b = maze[str2];if (a < b){if (a == 1 && b == n){add(a + n, b, 2, -1);}else{add(a + n, b, 1, -1);}}else{if (b == 1 && a == n){add(b + n, a, 2, -1);}else{add(b + n, a, 1, -1);}}}cout << "最多经过景点个数:" << 0 - MCMF(1, 2 * n, 2 * n) << endl;cout << "依次经过景点:\n";cout << str[1] << endl;memset(vis, 0, sizeof(vis));print(1, n);cout << str[1] << endl;return 0;
}//初始化
void init()
{memset(V, -1, sizeof(V)); //初始化顶点top = 0;                  //当前边下标maxflow = 0;
}//更新混合网络
void add(int u, int v, int c, int cost)
{add_edge(u, v, c, cost);add_edge(v, u, 0, -cost);
}//更新混合网络边
void add_edge(int u, int v, int c, int cost)
{//    top    top.v//u---------->v//构建邻接表:头插法 顺序存储法E[top].v = v;E[top].cap = c;E[top].flow = 0;E[top].cost = cost;E[top].next = V[u].first; //.next记录链的结点,下一个边的下标V[u].first = top++;       //顺序存储拉链
}
//输出网络邻接表
void printgraph(int n)
{cout << "\n网络邻接表\n";for (int i = 1; i <= n; i++){cout << "v" << i << " [" << V[i].first;for (int j = V[i].first; ~j; j = E[j].next){cout << "]--[" << E[j].v << "  " << E[j].cap << "  "<< E[j].flow << " " << E[j].cost << " " << E[j].next << "]\n";}cout << "\n";}
}
//输出实流边
void printflow(int n)
{cout << "实流边:\n";for (int i = 1; i <= n; i++){for (int j = V[i].first; ~j; j = E[j].next){if (E[j].flow > 0){cout << "v" << i << "--"<< "v" << E[j].v << " " << E[j].flow << " " << E[j].cost << "\n";}}}
}
//最小花费最大流
int MCMF(int s, int t, int n)
{int d; //可增量int i, mincost;mincost = 0; //maxflow为网络当前最大流量,mincost为网络当前最小费用while (SPFA(s, t, n)){                              //有从s到t的最小费用路d = INF;                   //初始化增流量cout << "增广路径: " << t; //             i       i^1     i       i+1            i      i+1=i^1   i    i-1=i^1for (i = pre[t]; i != -1; i = pre[E[i ^ 1].v]){                                     //i=pre[u.v] u---->v u<----v u---->v u<---v,通俗些就是u-->v就v<---u   v<--u u-->vd = min(d, E[i].cap - E[i].flow); //迭代找最小可增量cout << "--" << E[i ^ 1].v;}cout << "\n";cout << "增流量: " << d << "\n";//更新最大流maxflow += d;//增广路上正向边流量+d 反向边流量-dfor (int i = pre[t]; i != -1; i = pre[E[i ^ 1].v]){E[i].flow += d;E[i ^ 1].flow -= d;}mincost += dist[t] * d; //源点到t的单位花费*新增的流量}return mincost;
}
//求最小费用路
bool SPFA(int s, int t, int n)
{int u, v;queue<int> qu;                   //队列memset(vis, false, sizeof(vis)); //标记结点是否已经访问过了memset(c, 0, sizeof(c));         //入队次数memset(pre, -1, sizeof(pre));    //前驱数组初始化为-1//距离初始化:源点到各个结点的最短距离for (int i = 1; i <= n; i++){dist[i] = INF;}//源点入队vis[s] = true;c[s]++;dist[s] = 0;qu.push(s);while (!qu.empty()){//取队头,并消除标记u = qu.front();qu.pop();vis[u] = false;//遍历结点u的邻接表:即遍历u的所有出度边u--->xfor (int i = V[u].first; i != -1; i = E[i].next){v = E[i].v; //u---->vif (E[i].cap > E[i].flow && dist[v] > dist[u] + E[i].cost){ //松弛操作:这条边还可以增流且借助u-->v比直接到v cost少,如果不可增流则这条边不连通//更新源点--->v costdist[v] = dist[u] + E[i].cost;//记录v的前驱,pre记录的是边-->v 通过这条边最短到v 则v的前驱为这条边的下标pre[v] = i;//检测v是否在队列内if (!vis[v]){ //不在//v结点入队列c[v]++;qu.push(v); //入队vis[v] = true;if (c[v] > n){ //超过入队上上限,则说明有负环return false;}}}}}//最短可增流路径cout << "最短可增流路径数组:\n";cout << "dist[]=>";for (int i = 1; i <= n; i++){cout << " " << dist[i];}cout << "\n";if (dist[t] == INF){ //如果源点到汇点距离为正无穷,则不通:找不出最短可通路径return false;}return true;
}void print(int s, int t)
{cout<<"s->t:"<<s<<" "<<t<<"  "; int v;vis[s] = 1;for (int i = V[s].first; ~i; i = E[i].next){ v = E[i].v;//(E[i].flow>0&&E[i].cost<=0) 正向路线//(E[i].flow<0&&E[i].cost>=0) 反向路线if (!vis[v] && ((E[i].flow > 0 && E[i].cost <= 0) || (E[i].flow < 0 && E[i].cost >= 0))){print(v, t);if (v <= t){cout << str[v] << endl;}}}
}/*test
8 10
zhengzhou
luoyang
xian
chengdu
kangding
xianggelila
motuo
lasa
zhengzhou luoyang
zhengzhou xian
luoyang xian
luoyang chengdu
xian chengdu
xian xianggelila
chengdu lasa
kangding motuo
xianggelila lasa
motuo lasaresult:
最短可增流路径数组:
dist[]=> 0 -1 -2 -3 1000000 -3 1000000 -4 0 -1 -2 -3 1000000 -3 1000000 -4
增广路径: 16--8--14--6--11--3--10--2--9--1
增流量: 1
最短可增流路径数组:
dist[]=> 0 0 -1 -1 1000000 -1 1000000 -2 0 0 0 -1 1000000 -1 1000000 -2
增广路径: 16--8--12--4--10--3--9--1
增流量: 1
最短可增流路径数组:
dist[]=> 0 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000
最多经过景点个数:6
依次经过景点:
zhengzhou
luoyang
chengdu
lasa
xianggelila
xian
zhengzhou*/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40469.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旅游APP大数据分析:带你找到最佳旅游路线

如今&#xff0c;旅游App已经成为了现代旅游的必备工具&#xff0c;而在这个数字化的时代&#xff0c;大数据的应用已经成为了旅游App的重要手段。本文将介绍旅游App大数据分析的应用&#xff0c;带你找到最佳旅游路线。 一、大数据在旅游App中的应用 随着互联网的发展和普及&…

旅游管理系统(包含旅游最短路径规划算法等,包含系统分析的各种uml图和界面图)

1.1问题定义 本次课程的设计题目是设计一个大型景区的管理系统&#xff0c;此系统是为了便于景区的管理以及提升游客的旅游体验&#xff0c;更好的适应现如今日益发展的旅游业。 1.2问题分析 现有某景区需要开发一个景区信息管理系统&#xff0c;具体需求有&#xff1a;建立一…

精确又优雅,Azure AI 多能力融合(一)

点击上方蓝字 关注我们 &#xff08;本文阅读时间&#xff1a;6分钟&#xff09; 微软MVP实验室研究员 王豫翔&#xff0c;Leo 微软圈内人称王公子。微软10年MVP&#xff0c;大龄程序员。目前核心工作是使用微软 AI 技术设计可以落地的解决方案&#xff0c;也就是写 PPT。虽然热…

免费的AIGC3.5网站分享,同时支持4、3.5-16K、AI绘图

背景 AIGC作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个AI爱好者&#xff0c;翻遍了各大AIGC的网站&#xff0c;终于找到一个免费&#xff01;手机电脑通用&#xff01;可直接对话的AIGC&#xff0c;也有各种提供工作效…

chatgpt赋能python:Python取值:了解基础知识和应用方法

Python取值&#xff1a;了解基础知识和应用方法 什么是Python取值&#xff1f; Python取值是指从一个对象中获取信息或者值。对象可以包括列表、字典、元组、变量等。Python提供了多种方法来取值&#xff0c;包括基础的索引和切片操作&#xff0c;以及高级的列表推导式、字典…

AI智能在线问答——AI创作家

这是一个强大的在线工具&#xff0c;通过使用人工智能技术来创作文本内容&#xff0c;能够模拟人类的写作风格和语言习惯&#xff0c;让生成的文本内容更加自然流畅。能够大大提高用户的工作效率和创作能力。&#xff08;传送门&#xff1a;AI创作家 - AI写作 - 智能AI聊天对话…

云米科技市值再创新低:基本面不稳,业绩接连下滑,或将继续下探

12月3日&#xff0c;纳斯达克上市公司云米科技&#xff08;简称“云米”&#xff0c;NASDAQ:VIOT&#xff09;再跌7个百分点&#xff0c;盘中一度报2.88美元/股&#xff0c;再度创造历史新低。截至收盘&#xff0c;云米的股价收报2.91美元/股&#xff0c;单日跌幅为7.03%。 贝…

基于STM32的照片查看器课程报告

注&#xff1a;资料借鉴正点原子正点精英板STM32F1开发指南&#xff08;库函数版&#xff09;&#xff1b;程序是正点精英板STM32F1实验四十三章图片显示实验。 程序地址&#xff1a;实验38图片显示实验.7z-嵌入式文档类资源-CSDN下载 目录 1绪论 1.1选题的背景 1.2选题的目…

物联网家电第一股,想离开小米的云米现在有多少实力?

作者|星影 来源|智能相对论 Are you ok&#xff1f;你甚至不用哼唱&#xff0c;这句英文就能马上让人想起雷军与小米。但对于小米生态链中的另一家企业——云米科技&#xff0c;大多数人却搞不清两家公司之间的关系。 云米科技成立于2014年5月&#xff0c;主营业务是智能家电…

云米科技财报预测:财务业绩有望恢复,销售额和市场份额将下降

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 业务和财务概况 云米科技&#xff08;VIOT&#xff09;成立于2014年&#xff0c;其首款产品是2015年推出的小米&#xff08;01810&#xff09;品牌下的净水器。在接下来的几年里&#xff0c;该公司迅速发展&#xff0c;目前…

安波副教授:分布式人工智能进展与趋势

2020-12-31 09:43:19 2020年11月20日&#xff0c;由中国科学技术协会主办&#xff0c;中国国际科技交流中心、中国人工智能学会、新加坡通商中国承办的“中新数字经济与人工智能高峰论坛”云端召开。主题报告环节&#xff0c;新加坡南洋理工大学人工智能研究院联席院长校长委员…

李立军副总裁:后疫情时代服务机器人产业的发展机会

2021-01-23 21:27:31 2020年11月14日至15日&#xff0c;由中国人工智能学会、嘉兴市人民政府主办&#xff0c;嘉兴市南湖区人民政府、嘉兴科技城管理委员会、浙江未来技术研究院&#xff08;嘉兴&#xff09;共同承办的2020第十届中国智能产业高峰论坛&#xff08;CIIS 2020&a…

需求推送变革!陈小平教授深度剖析机器人因何由精确性转向灵巧性

陈小平教授从精确性和灵巧性两个方面深入分析了机器人过去取得的成就&#xff0c;及将来面临的挑战。以下是陈教授的演讲实录&#xff08;为使文章简介规范&#xff0c;略有改动&#xff09;&#xff1a; 讲座内容 机器人灵巧性&#xff1a;需求推动的技术变革 机器人从精确性向…

云米科技的变与不变:毛利率连降3年,核心高管仅剩陈小平一人

近期&#xff0c;纳斯达克上市公司云米全屋互联网家电有限公司&#xff08;NASDAQ:VIOT&#xff0c;下称“云米”或“云米科技”&#xff09;发布截至2020年12月31日的2020年第四季度及全年财报。财报显示&#xff0c;云米多项指标出现下滑。 具体来看&#xff0c;云米2020年第…

云米美国上市雷军系持股40% 陈小平:重新定义家的未来

雷帝网 雷建平 9月25日报道 小米净水器生产商云米今日在美国纳斯达克上市&#xff0c;发行价为9美元&#xff0c;以发行价计算&#xff0c;市值超过7亿美元。云米上市也宣告中国“家庭物联网第一股”的诞生。 云米CEO陈小平在上市现场的致辞中感谢了两个人&#xff0c;分别是小…

演讲实录丨中科大陈小平教授《从封闭性到非封闭性:2020到2035年智能机器的机遇和挑战》...

来源&#xff1a;中国人工智能学会 陈小平 中国科学技术大学机器人实验室主任、教授 以下是陈小平教授的演讲实录&#xff1a; 非常高兴有这个机会进行中、新学术交流。本报告包括四方面内容。第一&#xff0c;关于人工智能&#xff08;简称AI&#xff09;的两种类型&#xff0…

用 Python 进行音乐创作

文/世界上的霸主 图片来源于网络 投稿邮箱&#xff1a;pythonpost163.com 前言 上期留了尾&#xff0c;卖了关子。接着上回用 Python 播放多声轨 MIDI 文件音乐继续为您说。 如今&#xff0c;许多人尝试用计算机创作乐器&#xff0c;普遍方法是随机生成一段音乐&#xff0c;和…

Github ChatGPT-Web:了解最新AI技术的前沿应用!

近年来OpenAI的ChatGPT模型在自然语言处理领域取得了很大的进展&#xff0c;并且已经在全球范围内得到了广泛的应用和普及。ChatGPT不仅可以用于生成对话和文本摘要等任务&#xff0c;还可以用于机器翻译、问答系统、情感分析等多个领域。ChatGPT已经成为自然语言处理领域的一个…

chatgpt赋能python:Python怎么将界面和程序交互

Python怎么将界面和程序交互 随着互联网技术的不断发展和普及&#xff0c;越来越多的人开始关注于网站的设计和开发。在Web应用程序的开发过程中&#xff0c;与用户进行交互是至关重要的一个方面&#xff0c;而Python作为一种强大的开发语言&#xff0c;可以很好地帮助我们实现…

汇正财经骗局?大盘午后有修复,科创50大涨2.69%

盘面回顾&#xff1a; 沪深创集体调整&#xff0c;收盘沪指跌0.09%&#xff0c;深成指跌0.37%&#xff0c;创业板指跌1.2%&#xff0c;科创50全天占优&#xff0c;收盘涨2.69%。板块个股&#xff0c;早上6G概念股开盘大涨&#xff0c;业绩增长股大受追捧&#xff0c;算力、CPO…