[網絡流24題] 航空路線問題 (費用流)

洛谷傳送門?LOJ傳送門

這道題的圖還挺好想的吧

反正都是無向邊,起點走到終點再回到起點,就相當于從起點走$2$次到達終點,且這兩次不經過相同的點,還要經過盡可能多的點

很經典的費用流建圖

限制點通過次數->拆點連邊,流量為$1$,費用為$1$

圖中的其他邊,編號較小的指向編號較大的,流量為$inf$,費用為$0$

跑最大費用最大流即可

注意有$1$直接到$n$的情況,所以其他邊流量要設置到至少大于$2$

至于輸出方案呢,在殘量網絡中,每次都$dfs$找出一條從匯點到源點的路徑即可

  1 #include <map>
  2 #include <string>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <iostream>
  6 #include <algorithm>
  7 #define N1 210
  8 #define M1 40010
  9 #define ll long long
 10 #define dd double
 11 #define inf 0x3f3f3f3f
 12 using namespace std;
 13 
 14 int gint()
 15 {
 16     int ret=0,fh=1;char c=getchar();
 17     while(c<'0'||c>'9'){if(c=='-')fh=-1;c=getchar();}
 18     while(c>='0'&&c<='9'){ret=ret*10+c-'0';c=getchar();}
 19     return ret*fh;
 20 }
 21 struct Edge{
 22 int head[N1],to[M1<<1],nxt[M1<<1],flow[M1<<1],cost[M1<<1],cte;
 23 void ae(int u,int v,int F,int C)
 24 {
 25     cte++; to[cte]=v; flow[cte]=F; cost[cte]=C;
 26     nxt[cte]=head[u]; head[u]=cte;
 27 }
 28 }e,E;
 29 int n,m,nn,S,T;
 30 map<string,int>mp;
 31 int que[M1],hd,tl,cost[N1],flow[N1],id[N1],use[N1];
 32 int spfa()
 33 {
 34     int x,j,v;
 35     memset(flow,0,sizeof(flow));
 36     for(j=S;j<=T;j++) cost[j]=-inf;
 37     hd=1,tl=0; que[++tl]=S; cost[S]=0; flow[S]=inf; use[S]=1;
 38     while(hd<=tl)
 39     {
 40         x=que[hd++];
 41         for(j=e.head[x];j;j=e.nxt[j])
 42         {
 43             v=e.to[j];
 44             if( cost[v]<cost[x]+e.cost[j] && e.flow[j]>0 )
 45             {
 46                 cost[v]=cost[x]+e.cost[j]; id[v]=j;
 47                 flow[v]=min(flow[x],e.flow[j]);
 48                 if(!use[v]) que[++tl]=v, use[v]=1;
 49             }
 50         }
 51         use[x]=0;
 52     }
 53     return cost[T]!=-inf;
 54 }
 55 int stk[N1],tp;
 56 void dfs(int x)
 57 {
 58     int j,v;
 59     if(x<=n) stk[++tp]=x;
 60     if(x==1) return;
 61     for(j=e.head[x];j;j=e.nxt[j])
 62     {
 63         v=e.to[j];
 64         if(!e.flow[j]) continue;
 65         if(x>n){
 66             if(v==x-n)
 67             { e.flow[j]--; dfs(v); break; }
 68         }else{
 69             if(v<x+n)
 70             { e.flow[j]--; dfs(v); break; }
 71         }
 72     }
 73 }
 74 char str[N1][20];
 75 void EK()
 76 {
 77     int x,tcost=0,mxflow=0,i,len,j;
 78     while(spfa())
 79     {
 80         mxflow+=flow[T]; tcost+=flow[T]*cost[T];
 81         for(x=T;x!=S;x=e.to[id[x]^1])
 82         {
 83             e.flow[id[x]]-=flow[T];
 84             e.flow[id[x]^1]+=flow[T];
 85         }
 86     }
 87     if(mxflow<2){ puts("No Solution!"); return; }
 88     printf("%d\n",tcost-2);
 89     dfs(nn); 
 90     while(tp) 
 91     {
 92         x=stk[tp]; len=strlen(str[x]);
 93         for(j=0;j<len;j++) printf("%c",str[x][j]);
 94         puts(""); tp--;
 95     }
 96     dfs(nn); 
 97     for(i=2;i<=tp;i++)
 98     {
 99         x=stk[i]; len=strlen(str[x]);
100         for(j=0;j<len;j++) printf("%c",str[x][j]);
101         puts(""); 
102     }
103 }
104 int main()
105 {
106     scanf("%d%d",&n,&m);
107     string s;int i,j,x,y,len; 
108     nn=n+n; S=0; T=nn+1; e.cte=1;
109     for(i=1;i<=n;i++)
110     {
111         cin>>s; mp[s]=i; len=s.length();
112         for(j=0;j<len;j++)
113             str[i][j]=s[j];
114     }
115     e.ae(1,1+n,2,1); e.ae(1+n,1,0,-1); 
116     e.ae(n,n+n,2,1); e.ae(n+n,n,0,-1);
117     for(i=2;i<n;i++) e.ae(i,i+n,1,1), e.ae(i+n,i,0,-1);
118     for(i=1;i<=m;i++)
119     {
120         cin>>s; x=mp[s]; cin>>s; y=mp[s];
121         if(x>y) swap(x,y);
122         e.ae(x+n,y,2,0); e.ae(y,x+n,0,0);
123     }
124     e.ae(S,1,2,0); e.ae(1,S,0,0);
125     e.ae(nn,T,2,0); e.ae(T,nn,0,0);
126     EK();
127     return 0;
128 }

?

轉載于:https://www.cnblogs.com/guapisolo/p/10295888.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248616.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go語言字符串和正則表達式

字符串相關方法 獲取字符串長度 注意: Go語言編碼方式是UTF-8,在UTF-8中一個漢字占3個字節package main import "fmt" func main() { str1 : "lnj" fmt.Println(len(str1)) // 3 str2 : "lnj" fmt.Println(len(str2)) // 12 } 如果字符串中包含中…

你疏漏的 JS 函數硬核知識?這里幫你總結了

重點 更多前端知識 誠邀各位前端從事者愛好者加入前端大佬技術交流社區&#xff0c;本社區主要分享技術棧、個人心得、技術交流、問題解惑等前端體系交流 點擊下方文字加入 前端大佬技術交流社區 1. 函數的定義和調用 1.1 函數的定義方式 方式1 函數聲明方式 function 關鍵…

7 月 1 日

7 月 1 日 今日內容 1.計算機基礎知識 2.python簡介 3.快速入門 昨日回顧 無內容詳細 1.計算機基礎知識 輸入輸出設備 CPU 硬盤 電源 中央處理器 處理各種數據 相當于人的大腦 內存 存儲數據 硬盤 存儲數據的 什么是操作系統 控制計算機工作的流程 軟件 什么是應用程序 安裝在操…

再見了 React、Angular,Vue3 才是 yyds

切記一定要看到最后&#xff01;&#xff01;&#xff01; 最近看到一篇文章上面是一作者資訊一位IT前輩&#xff0c;問他怎么看待工作 2 年的前端開發&#xff0c;月薪就高達 30k、40k 的現狀。 他說&#xff0c;在眾多編程技術中&#xff0c;前端算比較容易入門和提升的&am…

HBase實戰:記一次Safepoint導致長時間STW的踩坑之旅

本文記錄了HBase中Safepoint導致長時間STW此問題的解決思路及辦法。上篇文章回顧&#xff1a;HBase Replication詳解?過 程 記 錄現象&#xff1a;小米有一個比較大的公共離線HBase集群&#xff0c;用戶很多&#xff0c;每天有大量的MapReduce或Spark離線分析任務在進行訪問&a…

scrapy 第一個案例(爬取騰訊招聘職位信息)

import scrapy import jsonclass TzcSpider(scrapy.Spider):# spider的名字&#xff0c;唯一name tzc# 起始地址start_urls [https://hr.tencent.com/position.php?keywordspython&tid0&lid2268]# 每個url爬取之后會調用這個方法def parse(self, response):tr resp…

系統帶你學習 WebAPIs 第一講

Web APIs 本篇學習目標&#xff1a; 能夠通過ID來獲取元素 能夠通過標簽名來獲取元素 能夠通過class來獲取元素 能夠通過選擇器來獲取元素 能夠獲取body和html元素 能夠給元素注冊事件 能夠修改元素的內容 能夠區分innerText和innerHTML的區別 能夠修改像div這類普通元素的屬性…

react-webpack config webpack@3.4.1

1.最重要的一點 yarn add webpack3.4.1 -g 2. 解決跨域請求 webpack.json 中添加 https://segmentfault.com/q/1010000008190876?_ea1579884 webpack config less -----框架 ----查看考鏈接 https://blog.csdn.net/mjzhang1993/article/details/79013430轉載于:https://w…

系統帶你學習 WebAPIs 第二講

Web APIs 本篇學習目標&#xff1a; 能夠說出排他操作的一般實現步驟 能夠使用html5中的dataset方式操作自定義屬性 能夠根據提示完成百度換膚的案例 能夠根據提示完成全選案例 能夠根據提示完成tab欄切換案例 能夠區分元素節點、文本節點、屬性節點 能夠獲取指定元素的父元素 …

在微信瀏覽器中 location.reload() 不刷新解決方案(直接調用方法)

1、問題 在微信瀏覽器中&#xff0c;需要時刷新當前頁面。 正常情況下我們直接使用 location.reload 方法來刷新。 2、解決方法 function realod(){var {search,href} window.location;href href.replace(/&?t_reload(\d)/g,)window.location.href href(search?&:…

Python爬蟲學習筆記1:request、selenium、ChromeDrive、GeckoDriver等相關依賴安裝

系列學習筆記參考&#xff1a;python3網絡爬蟲開發實戰 requests # pip install requests import requestsselenium Selenium是一個自動化測試工具&#xff0c;利用它我們可以驅動瀏覽器執行特定的動作&#xff0c;如點擊、下拉等 操作 。 對于一些 JavaScript誼染的頁面來說&a…

系統帶你學習 WebAPIs 第三講

Web APIs 本篇學習目標&#xff1a; 能夠使用removeChild()方法刪除節點 能夠完成動態生成表格案例 能夠使用傳統方式和監聽方式給元素注冊事件 能夠說出事件流執行的三個階段 能夠在事件處理函數中獲取事件對象 能夠使用事件對象取消默認行為 能夠使用事件對象阻止事件冒泡 能…

CSS3文本與字體

一、CSS3 換行 1、word-break&#xff08;規定自動換行的處理方法&#xff09; word-break: normal / break-all / keep-all;/* normal&#xff1a;使用瀏覽器默認的換行規則 break-all&#xff1a;允許在單詞內換行 keep-all&#xff1a;只能在半角空格或連字符處換行 */ 兼容…

系統帶你學習 WebAPIs 第四講

Web APIs 本篇學習目標&#xff1a; 能夠說出常用的3-5個鍵盤事件 能夠知道如何獲取當前鍵盤按下的是哪個鍵 能夠知道瀏覽器的頂級對象window 能夠使用window.onload事件 能夠使用window.onresize事件 能夠說出兩種定時器的區別 能夠使用location對象的href屬性完成頁面之間的跳…

linux chrome 安裝過程記錄

最近&#xff0c;由于公司需要做爬蟲抓取一些新聞&#xff0c;在開發過程中&#xff0c;發現有些網站有一定的反爬措施&#xff0c;通過瀏覽器訪問一切正常&#xff0c;通過其他方式&#xff0c;包括&#xff1a;curl&#xff0c;urlconnection 等&#xff0c;就算加入了cookie…

系統帶你學習 WebAPIs 第五講

Web APIs 本篇學習目標: 能夠說出常見 offset 系列屬性的作用 能夠說出常見 client 系列屬性的作用 能夠說出常見 scroll 系列屬性的作用 能夠封裝簡單動畫函數 **1.1. **元素偏移量 offset 系列 1.1.1 offset 概述 offset 翻譯過來就是偏移量&#xff0c; 我們使用 offset系…

ajax請求相關問題

Ajax中async:false/true的作用&#xff1a; async. 默認是 true&#xff0c;即為異步方式&#xff0c;$.ajax執行后&#xff0c;會繼續執行ajax后面的腳本&#xff0c;直到服務器端返回數據后&#xff0c;觸發$.ajax里的success方法&#xff0c;這時候執行的是兩個線程。 async…

有贊美業微前端的落地總結

2020年4月&#xff0c;有贊美業的前端團隊歷經7個月時間&#xff0c;完成了美業PC架構從單體SPA到微前端架構的設計、遷移工作。PPT在去年6月份就有了&#xff0c;現在再整理一下形成文章分享給大家。 頭圖 目錄 Part 01 “大話”微前端 微前端是什么 背景 目標 達成價值 …

bcp文件, 逗號文件

bcp 實用工具 https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility?viewsql-server-2017 大容量復制程序實用工具 (bcp) 可以在 Microsoft SQL Server 實例和用戶指定格式的數據文件間大容量復制數據。 使用 bcp 實用工具可以將大量新行導入 SQL Server 表&#xff0c;或…

遠程登錄和復制文件

命令&#xff1a; ssh 對應英文&#xff1a; secure shell 使用&#xff1a; ssh [-P] 用戶名ip 優點&#xff1a; 加密和壓縮&#xff0c;即安全和提高傳輸速度 注意&#xff1a; 除了windows系統外的系統默認有ssh客戶端&#xff0c;直接使用命令便可&#xff1b; windows系統…