[网络流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.mzph.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系统…