洛谷P2770 航空路线问题(费用流)
完了这题好厉害……字符串什么的好麻烦……
要求从$1$到$n$的路径,不重复,经过边数最多
每一个点拆成两个,$A_i,B_i$,然后$A_i$到$B_i$连容量为$1$,费用为$1$的边,保证每个点只被选一次
然后$1$和$n$的话要容量为$2$
然后有连边的话,$B_i$向$A_j$连边,容量$1$,费用$1$
要选的点最多,那么就是要费用最大,所以跑一个最大费用流
然后找方案的话,直接dfs,然后正着和倒着输出
有几个细节,写在代码里了
//minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
const int N=,M=;
int ver[M],Next[M],head[N],edge[M],flow[M],tot=;
int dis[N],disf[N],Pre[N],last[N],vis[N],maxflow,maxcost;
int n,m,s,t;bool check=;
queue<int> q;
map<string,int> mp;
string name[N];
inline void add(int u,int v,int f,int e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,flow[tot]=f,edge[tot]=e;
ver[++tot]=u,Next[tot]=head[v],head[v]=tot,flow[tot]=,edge[tot]=-e;
}
bool spfa(){
memset(dis,0xef,sizeof(dis));
q.push(s),dis[s]=,disf[s]=inf,Pre[t]=-;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=;
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(flow[i]&&dis[v]<dis[u]+edge[i]){
dis[v]=dis[u]+edge[i],last[v]=i,Pre[v]=u;
disf[v]=min(disf[u],flow[i]);
if(!vis[v]) vis[v]=,q.push(v);
}
}
}
return ~Pre[t];
}
void dinic(){
while(spfa()){
int u=t;maxflow+=disf[t],maxcost+=disf[t]*dis[t];
while(u!=s){
flow[last[u]]-=disf[t];
flow[last[u]^]+=disf[t];
u=Pre[u];
}
}
}
int ans[];int num=;
void out(int u){
ans[++num]=u;
for(int i=head[u];i;i=Next[i]){
if(flow[i]==&&edge[i]>=){
out(ver[i]);
flow[i]=;
return;
}
}
}
int main(){
//freopen("testdata.in","r",stdin);
string s1,s2;
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i){
cin>>s1;
mp[s1]=i;
name[i]=s1;
add(i,i+n,,);
}
for(int i=;i<=m;++i){
cin>>s1>>s2;
int a=mp[s1],b=mp[s2];
if(a>b) swap(a,b);
if(a==&&b==n) check=;
add(a+n,b,,);
}
add(,n+,,),add(n,n+n,,);
s=,t=n+n;
dinic();
if(!maxflow||(maxflow==&&!check)) return puts("No Solution!"),;
if(maxflow==&&check){cout<<<<'\n'<<name[]<<'\n'<<name[n]<<'\n'<<name[]<<'\n';return ;}
printf("%d\n",maxcost/-);
//这里的最多城市数是这个
//因为考虑如果边连成一个环,边数等于点数
//然后每个点拆成两个,除以二
//然后因为s'和t'被重复了两次,减去1
out(s);
for(int i=;i<=num;++i) if(ans[i]<=n) cout<<name[ans[i]]<<'\n';
num=;
out(s);
for(int i=num-;i;--i) if(ans[i]<=n) cout<<name[ans[i]]<<'\n';
//最后两个肯定是t和t',不用管
return ;
}
洛谷P2770 航空路线问题(费用流)的更多相关文章
- 洛谷P2770 航空路线问题(费用流)
题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...
- 洛谷 P2770 航空路线问题【最大费用最大流】
记得cnt=1!!因为是无向图所以可以把回来的路看成另一条向东的路.字符串用map处理即可.拆点限制流量,除了1和n是(i,i+n,2)表示可以经过两次,其他点都拆成(i,i+n,1),费用设为1,原 ...
- 洛谷P2770 航空路线问题 最小费用流
Code: #include<cstdio> #include<iostream> #include<algorithm> #include<vector&g ...
- 洛谷 1004 dp或最大费用流
思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...
- 洛谷P4003 无限之环(费用流)
传送门 神仙题啊……不看题解我可能一年都不一定做得出来……FlashHu大佬太强啦 到底是得有怎样的脑回路才能一眼看去就是费用流啊…… 建好图之后套个板子就好了,那么我们着重来讨论一下怎么建图 首先, ...
- 洛谷P4012 深海机器人问题(费用流)
题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...
- 洛谷P2517 HAOI2010 订货 (费用流)
标准的费用流问题,关键在于巧妙地建模 一共有n个月份,源点设为0,汇点设为n+1 1.源点向所有月份连边,容量为正无穷,费用为该月进货的费用 2.每个月向下一个月连边,容量为仓库容量,费用为存货费用 ...
- 洛谷P4016 负载平衡问题 费用流
这道题还是很好的. 考察了选手对网络流的理解. 首先,任意两个相邻点之间的运货量时没有限制的. 我们可以将相邻点之间的流量建为无限大,单位费用设为 1,代表运输一个货物需耗费一个代价. 由于题目要求最 ...
- 洛谷.1251.餐巾计划问题(费用流SPFA)
题目链接 /* 每一天的餐巾需求相当于必须遍历某些点若干次 设q[i]为Dayi需求量 (x,y)表示边x容y费 将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定 ...
随机推荐
- 一个7重嵌套表EF添加语句,注意子表赋值过程中只需写子表主键赋值,不需要写子表外键=父表主键。EF创建时会自动将子表外键设为与父表主键相等
AIRPORT_HELIPORT tt = new AIRPORT_HELIPORT() { AIRPORT_HELIPORT_UUID = Gui ...
- C# IP地址去掉端口号
string Ip1 = "192.168.0.199:7777"; string Ip2 = Ip1.Remove(Ip1.IndexOf(':'));
- Java面向对象-面向对象编程之基本概念
面向对象这个概念,每本书上的说法定义很多. 我自己根据我的经验,自己归档总结了下, 所谓面向对象,就是 以基于对象的思维去分析和解决问题,万物皆对象: 面向对象经常和面向过程放一起讨论: 这里举例, ...
- linux进程的问题
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h& ...
- 仿照admin写一个startk组件
settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.conten ...
- nand中间出现坏块,无法正常启动内…
我板子的启动过程如下: ..showlogo.. Flash: 1 MB NAND: SLC detected.256 MB In: serial Out: serial ...
- Linux下安装配置MySQL5.7服务器
Linux下安装配置MySQL服务器 一.安装环境 ============ OS:centos6.8 MySQL:mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz ...
- Python基础—流程控制
一.Python流程控制 计算机程序在解决某个具体问题时,包括三种情形,即顺序执行所有的语句.选择执行部分的语句和循环执行部分语句,这正好对应着程序设计中的三种程序执行结构流程:顺序结构.选择结构和循 ...
- GBK/ UTF-8/ UNICODE(字符编码)
在python2中:如果执行程序,在编译器中,因为默认的编码是ASCII码(英文),所以如果输入中文就会出现乱码,因此为了避免这种乱码的情况发生,在输入中文字符串之后,必须进行手动转码,将GBK/ U ...
- java基础之JDBC六:DBCP 数据库连接池简介
我们之前写的代码中的数据库连接每次都是自己创建,用完以后自己close()销毁的,这样是很耗费资源的,所以我们引入DBCP DBCP简介 概述: Data Base Connection Pool, ...