洛谷 P2770 航空路线问题【最大费用最大流】
记得cnt=1!!因为是无向图所以可以把回来的路看成另一条向东的路。字符串用map处理即可。拆点限制流量,除了1和n是(i,i+n,2)表示可以经过两次,其他点都拆成(i,i+n,1),费用设为1,原图中的边(i,j)连接(i+n,j,1),注意特判掉iq&&jnst直接相连的情况,流量要设为2,然后跑最大费用最大流,如果流量小于2就是无解,否则分别从s和tdfs输出方案。
记得输出方案前先输出一次起点。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<string>
using namespace std;
const int N=1000005,inf=1e9;
int n,m,s,t,h[N],cnt=1,dis[N],fr[N],a[N][2],ans,sum;
bool v[N];
string c1,c2,ha[N];
map<string,int>mp;
struct qwe
{
int ne,no,to,va,c;
}e[N<<2];
void add(int u,int v,int w,int c)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].no=u;
e[cnt].to=v;
e[cnt].va=w;
e[cnt].c=c;
h[u]=cnt;
}
void ins(int u,int v,int w,int c)
{//cout<<u<<" "<<v<<" "<<w<<endl;
add(u,v,w,c);
add(v,u,0,-c);
}
bool spfa()
{
for(int i=s;i<=t;i++)
dis[i]=-inf;
queue<int>q;
q.push(s);
dis[s]=0;
v[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
v[u]=0;
for(int i=h[u];i;i=e[i].ne)
if(e[i].va&&dis[e[i].to]<dis[u]+e[i].c)
{
fr[e[i].to]=i;
dis[e[i].to]=dis[u]+e[i].c;
if(!v[e[i].to])
{
v[e[i].to]=1;
q.push(e[i].to);
}
}
}//cout<<dis[t]<<endl;
return dis[t]!=-inf;
}
void mcf()
{
int x=inf;
for(int i=fr[t];i;i=fr[e[i].no])
x=min(x,e[i].va);
sum+=x;
for(int i=fr[t];i;i=fr[e[i].no])
{
e[i].va-=x;
e[i^1].va+=x;
ans+=x*e[i].c;//cout<<e[i].c<<endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
s=1,t=n+n;
for(int i=1;i<=n;i++)
{
cin>>c1;
mp[c1]=i;
ha[i]=c1;
}
for(int i=1;i<=m;i++)
{
cin>>c1>>c2;//cout<<c1<<endl<<c2<<endl;
int x=mp[c1],y=mp[c2];//cout<<x<<" "<<y<<endl;
if(x>y)
swap(x,y);
if(x==1&&y==n)
ins(x+n,y,2,0);
else
ins(x+n,y,1,0);
}
ins(1,1+n,2,1);
ins(n,n+n,2,1);
for(int i=2;i<n;i++)
ins(i,i+n,1,1);
while(spfa())
mcf();//cout<<sum<<" "<<ans<<endl;
if(sum<2)
{
puts("No Solution!");
return 0;
}
cout<<ans-2<<endl;
cout<<ha[1]<<endl;
for(int i=h[s+n],j,k;i;i=e[i].ne)
if(!e[i].va&&!(i&1))
{
k=e[i].to;
while(k)
{
cout<<ha[k]<<endl;
v[k]=1;
for(j=h[k+n],k=0;j;j=e[j].ne)
if(!e[j].va&&!(j&1))
{
k=e[j].to;
break;
}
}
break;
}
for(int i=h[t-n],j,k;i;i=e[i].ne)
if(!e[i^1].va&&(i&1)&&!v[e[i].to-n])
{
k=e[i].to-n;
while(k)
{
cout<<ha[k]<<endl;
v[k]=1;
for(j=h[k],k=0;j;j=e[j].ne)
if(!e[j^1].va&&(j&1))
{
k=e[j].to-n;
break;
}
}
break;
}
return 0;
}
洛谷 P2770 航空路线问题【最大费用最大流】的更多相关文章
- 洛谷P2770 航空路线问题(费用流)
传送门 完了这题好厉害……字符串什么的好麻烦…… 要求从$1$到$n$的路径,不重复,经过边数最多 每一个点拆成两个,$A_i,B_i$,然后$A_i$到$B_i$连容量为$1$,费用为$1$的边,保 ...
- 洛谷P2770 航空路线问题(费用流)
题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...
- 洛谷P2770 航空路线问题 最小费用流
Code: #include<cstdio> #include<iostream> #include<algorithm> #include<vector&g ...
- 洛谷P3381 - 【模板】最小费用最大流
原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...
- 洛谷 P2053 [SCOI2007]修车(最小费用最大流)
题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...
- 洛谷 P3381【模板】最小费用最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...
- 洛谷 P3381 【模板】最小费用最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数\(N.M.S.T\) ...
- 洛谷P1251 餐巾计划问题(最小费用最大流)
题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...
- 洛谷P4016 负载平衡问题(最小费用最大流)
题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...
随机推荐
- HDU 6397 组合数学+容斥 母函数
Character Encoding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- [Bzoj4570][Scoi2016]妖怪(右上凸包)
4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1110 Solved: 336[Submit][Status][ ...
- 51nod 马拉松30 C(构二分图+状压dp)
题意 分析 考虑一个图能被若干简单环覆盖,那么一定是每个点恰好一个出度,恰好一个出度 于是类似最小路径覆盖的处理,我们可以把每个点拆成2个点i和i',如果有一条边(i,j),那么将i和j'连起来 那么 ...
- loj517 计算几何瞎暴力(Trie树)
题目: https://loj.ac/problem/517 分析: 操作4比较特殊,我们先来分析下操作4 操作4相当于需要一个数据结构,使得里面的数据有序(这有很多选择) 结合操作1,操作4的“排序 ...
- CSS制作简单图标
CSS制作图标包括知识点如border-width.border-style.border-color.border-radius.对元素的定位拼接.旋转等结合起来. 图标效果如下(拖动滑块可缩放图标 ...
- 【Mongodb教程 第十三课 】PHP mongodb 的增删改查使用
<pre> <?php #phpinfo();die; #其他链接方式 #$conn=new Mongo(); #连接本地主机,默认端口. #$conn=new Mongo(&quo ...
- php验证邮箱
<?php if(isset($_POST['email'])){ $email = $_POST['email']; if(filter_var($email, FILTER_VALIDATE ...
- oracle--Windows不能在本地计算机启动OracleDBConsoleorcl .错误代码1
安装完数据库后能够启动,重新启动电脑后,手动启动就会报错. 现象: Windows 不能在 本地计算机 启动 OracleDBConsoleorcl.有关很多其它信息.查阅系统事件日志.假设这是非 M ...
- JS表格分页组件:fupage的设计思路和详细使用方法(未来考虑开源,争取在2015年)
一.背景 之前在秒针工作的时候,某js高级project师写了非常多自己的组件.当中一套是分页组件.叫做st-grid. 只是在我看来,bug太多.我常常给他反馈bug,我也不清楚为啥 ...
- web 界面设计---js提交表单
<script type="text/javascript"> function checkImage(){ var imageValue = document.get ...