LG2770/LOJ6122 航空路线问题 费用流 网络流24题
问题描述
题解
教训:关掉流同步之后就不要用其他输入输出方式了。
拆点。
两个拆点之间连\((1,1)\),其他连\((1,0)\)
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
void read(int &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=203;
const int maxm=1000003;
const int INF=0x3f3f3f3f;
int flag;
int n,m;
map<string,int>mp;
string s[maxn],s1,s2;
int Head[maxn],Next[maxm],to[maxm],w[maxm],co[maxm],tot=1;
int S,T,maxflow,ans;
void add(int x,int y,int flow,int cost){
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=flow,co[tot]=cost;
}
int dis[maxn],pre[maxm],now[maxn];
bool vis[maxn];
void dfs1(int x){
cout<<s[x]<<endl;
vis[x]=1;
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(y>n&&y<=2*n&&w[i]==0){
dfs1(y-n);break;
}
}
}
void dfs2(int x){
vis[x]=1;
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(y>n&&y<=2*n&&w[i]==0&&!vis[y-n]){
dfs2(y-n);break;
}
}
cout<<s[x]<<endl;
}
bool spfa(){
memset(dis,0xcf,sizeof(dis)),memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));
now[S]=INF;queue<int>q;q.push(S);vis[S]=1;dis[S]=0;
while(!q.empty()){
int x=q.front();vis[x]=0;q.pop();
for(int i=Head[x];i;i=Next[i]){
int y=to[i],len=w[i],cost=co[i];
if(!len||dis[y]>=dis[x]+cost) continue;
dis[y]=dis[x]+cost,now[y]=min(now[x],len);
pre[y]=i;
if(!vis[y]){q.push(y);vis[y]=1;}
}
}
return dis[T]!=(int)0xcfcfcfcf;
}
void upd(){
maxflow+=now[T],ans+=dis[T]*now[T];
int p=T;
while(p!=S){
int k=pre[p];
w[k]-=now[T],w[k xor 1]+=now[T];
p=to[k xor 1];
}
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i];mp[s[i]]=i;
}
S=n*2+1,T=S+1;
add(S,n+1,INF,0);add(n+1,S,0,0);
add(n,T,INF,0);add(T,n,0,0);
for(int i=1;i<=n;i++){
if(i!=1&&i!=n) add(i+n,i,1,1),add(i,i+n,0,-1);
else add(i+n,i,2,1),add(i,i+n,0,-1);
}
for(int i=1;i<=m;i++){
cin>>s1;cin>>s2;
int x=mp[s1],y=mp[s2];
if(x>y) swap(x,y);
if(x==1&&y==n) flag=1;
add(x,y+n,1,0),add(y+n,x,0,0);
}
while(spfa()) upd();
if(maxflow==2) cout<<ans-2<<endl;
else if(maxflow==1&&flag){
cout<<2<<endl;cout<<s[1]<<endl<<s[n]<<endl<<s[1]<<endl;return 0;
}
else{
cout<<"No Solution!"<<endl;return 0;
}
memset(vis,0,sizeof(vis));
dfs1(1);dfs2(1);
return 0;
}
LG2770/LOJ6122 航空路线问题 费用流 网络流24题的更多相关文章
- cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)
描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...
- 洛谷P2770 航空路线问题(费用流)
题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...
- LG2766 最长不下降子序列问题 最大流 网络流24题
问题描述 LG2766 题解 \(\mathrm{Subtask 1}\) 一个求最长不下降子序列的问题,发现\(n \le 500\),直接\(O(n^2)\)暴力DP即可. \(\mathrm{S ...
- 【题解】【网络流24题】航空路线问题 [P2770] [Loj6122]
[题解][网络流24题]航空路线问题 [P2770] [Loj6122] 传送门:航空路线问题 \([P2770]\) \([Loj6122]\) [题目描述] 给出一张有向图,每个点(除了起点 \( ...
- 【网络流24题】最长k可重线段集(费用流)
[网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...
- 【网络流24题】最长k可重区间集(费用流)
[网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...
- Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)
Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...
- Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)
Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...
- Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...
随机推荐
- <String> 179 ,6, 168
179. Largest Number 冒泡排序,每一轮都把最小的数字选出放在最后. class Solution { public String largestNumber(int[] nums) ...
- nginx 一键安装
#!/bin/bash1. 关闭防火墙 和 selinux service iptables stopsetenforce 0 2. 判断是否有nginx服务netstat -ntlp |grep n ...
- bzoj4520 K远点对
题目链接 思路 这个"\(K\)远"点对一直理解成了距离第\(K\)大的点对\(233\). 要求第\(K\)远,那么我们只要想办法求出来最远的\(K\)个点对就可以了. 用一个大 ...
- 编程计算2×3阶矩阵A和3×2阶矩阵B之积C。 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值。 要求: (1)从键盘分别输入矩阵A和B, 输出乘积矩阵C (2) **输入提示信息为: 输入矩阵A之前提示:"Input 2*3 matrix a:\n" 输入矩阵B之前提示
编程计算2×3阶矩阵A和3×2阶矩阵B之积C. 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值. 要求: ...
- How does Chrome Extension crx Downloader work? ——— From crxdown.com
How does Chrome Extension crx Downloader work? Home >> blog >> How does Chrome Extension ...
- LCT好题总结
写在前面: 初探多项式之后,开始了数据结构之旅,可持久化数据结构的总结大概是咕了,只总结一些$LCT$的题 T1:水管局长数据加强版 发现题中只有删边操作,而我们只会做加边,所有考虑时光倒流 先在最后 ...
- [开源]OSharpNS 步步为营系列 - 2. 添加业务数据层
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- Docker学习4-学会如何让容器开机自启服务
前言 小龙亲测重启服务器后 docker 容器没跑起来,相信有不少小伙伴在用docker部署容器的时候也发现每次开机服务就没有自启了,需要手动去执行把容器服务开启起来,但有没有可以让它开机自启呢?显然 ...
- torch_13_自定义数据集实战
1.将图片的路径和标签写入csv文件并实现读取 # 创建一个文件,包含image,存放方式:label pokemeon\\mew\\0001.jpg,0 def load_csv(self,file ...
- ICP&TPS:最近邻
经过了一段时间的研bai究gei...终于可以偷得几天闲了. 这里来补个档. 无论是ICP还是TPS,缺乏锚点的前提下.你总是要通过找另一个曲面的最近的点来实现你的work beimat:点数*3,f ...