luogu2770 航空路线问题 网络流

题目大意:

给定一张航空图,图中顶点代表城市,边代表 2 城市间的直通航线。现要求找出一条满足下述限制条件的且途经城市最多的旅行路线。
(1)从最西端城市出发,单向从西向东途经若干城市到达最东端城市,然后再单向从东向西飞回起点(可途经若干城市)。
(2)除起点城市外,任何城市只能访问 1 次。

 

关键字:网络流 方向等效转换 拆点 不交叉路径 特判

 

网络流:1个人旅行的过程可以看作以流量为1流动的过程。

方向等效转化:本问题可以看作两个人同时从最西的城市走向最东的城市,每个人占有1个流量,总流量为2。

拆点:题中说每个城市只经过一次,因此把一个城市看作容量为1的边,如果西东两个城市之间有航线,则把西城to节点连东城from节点,容量为1。为保证总流量为2,最西城边容量和最东城容量为2。

不交叉路径:流量为1,即可保证路径不交叉

特判:如果最西城与最东城有航线,则边的容量为2。

 

#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <cassert>
#include <map>
#include <string>
#include <iostream>
using namespace std;//#define test
#define INF 0x3f3f3f3f
#define LOOP(i,n) for(int i=1; i<=n; i++)
const int MAX_CITY = 110, MAX_EDGE = MAX_CITY*MAX_CITY + MAX_CITY * 2, MAX_NODE = MAX_CITY * 2;
map<string, int> loc;
string Cities[MAX_CITY];
bool Vis[MAX_CITY];
int TotCity, TotLine;struct MCMF
{struct Node;struct Edge;struct Node{int Id;Edge *Head, *Prev;int Dist;bool Inq;void Init(){Prev = NULL;Dist = INF;Inq = false;}};struct Edge{int Cap, Cost;Node *From, *To;Edge *Next, *Rev;Edge(int cap, int cost, Node *from, Node *to, Edge *next) :Cap(cap), Cost(cost), From(from), To(to), Next(next){}};Node _nodes[MAX_NODE];Edge *_edges[MAX_EDGE];int _vCount = 0, _eCount = 0;Node *Start, *Sink;int TotFlow, TotCost;void Reset(int n, int sId, int tId){_vCount = n;_eCount = 0;Start = &_nodes[sId], Sink = &_nodes[tId];TotFlow = TotCost = 0;}Edge* AddEdge(Node *from, Node *to, int cap, int cost){Edge *cur = _edges[++_eCount] = new Edge(cap, cost, from, to, from->Head);from->Head = cur;return cur;}void Build(int uId, int vId, int cap, int cost){Node *u = &_nodes[uId], *v = &_nodes[vId];u->Id = uId;v->Id = vId;Edge *edge1 = AddEdge(u, v, cap, cost);Edge *edge2 = AddEdge(v, u, 0, -cost);//遗忘点*2:-costedge1->Rev = edge2;edge2->Rev = edge1;}bool SPFA(){queue<Node*> q;for (int i = 1; i <= _vCount; i++)_nodes[i].Init();Start->Dist = 0;q.push(Start);while (!q.empty()){Node *u = q.front();q.pop();u->Inq = false;//易忘点for (Edge *e = u->Head; e; e = e->Next){if (e->Cap && u->Dist + e->Cost < e->To->Dist)//易忘点*2:e->Cap
                {e->To->Dist = u->Dist + e->Cost;e->To->Prev = e;if (!e->To->Inq){e->To->Inq = true;q.push(e->To);}}}}return Sink->Prev;}void Proceed(){while (SPFA()){assert(Sink->Dist != INF);int minFlow = INF;for (Edge *e = Sink->Prev; e; e = e->From->Prev)minFlow = min(minFlow, e->Cap);TotFlow += minFlow;for (Edge *e = Sink->Prev; e; e = e->From->Prev){e->Cap -= minFlow;e->Rev->Cap += minFlow;TotCost += minFlow * e->Cost;
#ifdef testprintf("%d-%d Cost %d restCap %d\n", e->From->Id, e->To->Id, e->Cost*minFlow, e->Cap);
#endif}
#ifdef testprintf("TotFlow %d TotCost %d\n", TotFlow, TotCost);
#endif}}int GetFlow(){return TotFlow;}int GetCost(){return TotCost;}
}g;void print1()
{MCMF::Node *cur = 1 + g._nodes;while (cur->Id != TotCity){Vis[cur->Id] = true;cout << Cities[cur->Id] << endl;cur = cur->Id + TotCity + g._nodes;for (MCMF::Edge *e = cur->Head; e; e = e->Next){if (!e->Cap && !Vis[e->To->Id] && e->To->Id > cur->Id-TotCity){cur = e->To;break;}}}
}void print2(int id)
{if (id == TotCity){cout << Cities[id] << endl;return;}Vis[id] = true;MCMF::Node *cur = id + TotCity + g._nodes;for (MCMF::Edge *e = cur->Head; e; e = e->Next){if (!e->Cap && !Vis[e->To->Id] && e->To->Id > cur->Id - TotCity){print2(e->To->Id);break;}}cout << Cities[id] << endl;
}int main()
{
#ifdef _DEBUGfreopen("c:\\noi\\source\\input.txt", "r", stdin);
#endifint sId, tId;string s1, s2;scanf("%d%d", &TotCity, &TotLine);sId = 1;tId = TotCity * 2;g.Reset(tId, sId, tId);LOOP(city, TotCity){cin >> Cities[city];loc.insert(pair<string, int>(Cities[city], city));if (city == 1 || city == TotCity)g.Build(city, city + TotCity, 2, -1);elseg.Build(city, city + TotCity, 1, -1);}LOOP(line, TotLine){cin >> s1 >> s2;int p1 = loc[s1], p2 = loc[s2];if (p2 < p1)swap(p1, p2);if (p1 == 1 && p2 == TotCity)g.Build(p1+TotCity, p2, 2, 0);elseg.Build(p1+TotCity, p2, 1, 0);}g.Proceed();if (g.TotFlow<2){cout << "No Solution!" << endl;return 0;}printf("%d\n", -g.TotCost-2);LOOP(v, g._vCount)g._nodes[v].Inq = false;print1();print2(1);return 0;
}

 

转载于:https://www.cnblogs.com/headboy2002/p/8431179.html

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

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

相关文章

手机录音ogg格式怎么转换mp3

Ogg这种音频格式刚出来的时候大家是非常热爱的&#xff0c;但是随着时代的发展&#xff0c;这种音频格式已经已经被取代了&#xff0c;现在呢走在音频格式前端的是MP3格式&#xff0c;这是大家都比较熟悉的&#xff0c;但是我们还是会经常下载到ogg这种格式的音频&#xff0c;就…

TP3.2设置URL伪静态满足更好的SEO效果

URL伪静态通常是为了满足更好的SEO效果&#xff0c;ThinkPHP支持伪静态URL设置&#xff0c;可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀&#xff0c;而不会影响当前操作的正常执行。 例如&#xff0c;我们设置 URL_HTML_SUFFIX>shtml 的话&#xf…

[机器学习] 推荐系统之协同过滤算法(转)

[机器学习]推荐系统之协同过滤算法 在现今的推荐技术和算法中&#xff0c;最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题. 1. 什么是推荐算法 推荐算法最早在1992年就提出来了&#xff0c;但是火起来实际上是最近这…

BundleFusion代码框架讲解

背景&#xff1a;前面用了几篇文章来记录和总结了&#xff0c;我在研究bundlefusion过程中遇到的一些问题以及解决方法&#xff0c;本来想实现给bundlefusion输入先验轨迹&#xff0c;然后让其根据给定的轨迹进行重建&#xff0c;这样即便在环境比较恶劣的情况下&#xff0c;也…

BundlePhobia

1、BundlePhobia用于分析npm package的依赖、bundle后的大小、下载速度预估等等&#xff0c;帮助你在引用一个package之前了解引入该package的代价。 2、也可以将项目的package.json文件上传&#xff0c;BundlePhobia会帮你评估项目中所有包的大小和加载速度。

VFL演示样例

VFL演示样例 上篇文章向大家介绍了VFL的基本的语法点&#xff0c;假设对下面演示样例不熟的童鞋&#xff0c;能够前去參考。废话不多说。我们直接来看演示样例。演示样例一 将五个大小同样、颜色不同的view排成一行&#xff0c;view间的间隔为15px,第一个view的间隔与屏幕的左边…

evo实用指令指南

下面这篇文章中有比较具体的关于evo的安装以及使用的介绍&#xff0c;其中一点很重要&#xff0c;就是可以把euroc形式的.csv的轨迹格式转换为tum格式的轨迹。 https://zhuanlan.zhihu.com/p/88223106#single evo_traj tum orb_slam2_tum.txt --reftum_groundtruth.txt -p --pl…

MailUtils

/***包名:com.thinkgem.jeesite.test*描述:package com.thinkgem.jeesite.test;*/ package com.thinkgem.jeesite.test;import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.regex.Matcher; import java.u…

ES6遍历对象

遍历对象 E S 6 一共有 5 种方法可以遍历对象的属性 。 for ... in for . . . in 循环遍历对象自身的和继承的可枚举属性&#xff08;不含 Symbol 属性&#xff09;。 Object.keys(obj)Object . keys 返回 一个数组&#xff0c;包括对象自身的&#xff08;不含继承的 &#xff…

SpringMvc中ModelAndView模型的应用

/** * 目标方法的返回值可以是 ModelAndView 类型。 * 其中可以包含视图和模型信息 * SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中. * return */ RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ String v…

ubuntu16.04 + ros-kinetic 配置cartographer

其实一直以来都感觉纯视觉SLAM很难落地产品&#xff0c;所以一直在找机会学习激光slam,之前也在深蓝学院上买了一个激光salm的课程&#xff0c;惭愧&#xff0c;至今也没开始学呢&#xff0c;年底之前&#xff0c;我想工作之余研究一下激光slam和ros&#xff0c;我感觉这两个东…

virtualbox中安装ubuntu

为什么80%的码农都做不了架构师&#xff1f;>>> virtualboxubuntu 安装virtualbox&#xff0c;当前版本是6.0.4下载ubuntu安装盘&#xff0c;建议lubuntu&#xff0c;链接是http://mirrors.ustc.edu.cn/ubuntu-cdimage/lubuntu/releases/18.04.2/release/lubuntu-1…

面向对象重写(override)与重载(overload)区别

一、重写&#xff08;override&#xff09; override是重写&#xff08;覆盖&#xff09;了一个方法&#xff0c;以实现不同的功能。一般是用于子类在继承父类时&#xff0c;重写&#xff08;重新实现&#xff09;父类中的方法。 重写&#xff08;覆盖&#xff09;的规则&#…

cartographer学习笔记--如何保存cartagrapher_ros建好的地图

今天开始跟着网友大佬学习cartographer. 1. 如何保存cartographer的地图数据 在运行cartographer过程中可以随时保存建好的地图&#xff0c;步骤如下&#xff1a; 首先是重新打开一个terminal, 如果你没有将你的cartographer_ros下的setup.bash文件写入到.bashrc中&#xff…

Java微信公众号开发(五)—— SVN版本控制工具

1 作用 两个疑问&#xff1a; 什么是版本控制&#xff1f;为什么要用版本控制工具&#xff1f;作用&#xff1a; 受保护受约束合作开发中&#xff0c;版本控制工具更重要的作用就是让开发者更好地协作&#xff0c;每个人的代码既能互相调用&#xff0c;来共同完成一个较大的功…

Linux之《荒岛余生》(二)CPU篇

为什么80%的码农都做不了架构师&#xff1f;>>> 温馨提示&#xff0c;动图已压缩&#xff0c;流量党放心查看。CPU方面内容不多&#xff0c;我们顺便学点命令。本篇是《荒岛余生》系列第二篇&#xff0c;垂直观测CPU。其余参见&#xff1a; Linux之《荒岛余生》&am…

PTA 06-图2 Saving James Bond - Easy Version (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/672 5-10 Saving James Bond - Easy Version (25分) This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by…

Ubuntu16.04上安装kitti2bag

kitti2bag是一个可以将kitti数据集转换为bag文件的工具&#xff0c;可以直接通过pip进行安装。由于kitti2bag中使用到ros&#xff0c;所以安装时你使用的python版本应该是2.7的因为ros只有在Python2.7时才能正常工作。比如说我&#xff0c;我安装了conda&#xff0c;在conda中安…

Nginx之windows下搭建

去nginx.org下载nginx 以nginx-1.8.1为例解压到D盘nginx-1.8.1目录 假设NGINX_HOME为D:\nginx-1.8.1 3种启动途径&#xff1a; 一、双击nginx.exe图标&#xff0c;可见黑窗口一闪而过&#xff0c;启动完毕。 二、命令行到nginx目录&#xff0c;输入nginx启动。&#xff08;注&a…

单片机错误笔记

记录下使用单片机过程中的一些错误&#xff0c;便于以后查询&#xff1a; 单片机型号&#xff1a;STC15F2K60S2 晶振&#xff1a;18.432 报错代码&#xff1a; *** WARNING L1: UNRESOLVED EXTERNAL SYMBOLSYMBOL: REC_DAT1MODULE: .\Objects\usart.obj (USART) …