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.pswp.cn/news/252373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252373.shtml
英文地址,請注明出處:http://en.pswp.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) …