记得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 航空路线问题【最大费用最大流】的更多相关文章

  1. 洛谷P2770 航空路线问题(费用流)

    传送门 完了这题好厉害……字符串什么的好麻烦…… 要求从$1$到$n$的路径,不重复,经过边数最多 每一个点拆成两个,$A_i,B_i$,然后$A_i$到$B_i$连容量为$1$,费用为$1$的边,保 ...

  2. 洛谷P2770 航空路线问题(费用流)

    题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...

  3. 洛谷P2770 航空路线问题 最小费用流

    Code: #include<cstdio> #include<iostream> #include<algorithm> #include<vector&g ...

  4. 洛谷P3381 - 【模板】最小费用最大流

    原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...

  5. 洛谷 P2053 [SCOI2007]修车(最小费用最大流)

    题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...

  6. 洛谷 P3381【模板】最小费用最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...

  7. 洛谷 P3381 【模板】最小费用最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数\(N.M.S.T\) ...

  8. 洛谷P1251 餐巾计划问题(最小费用最大流)

    题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...

  9. 洛谷P4016 负载平衡问题(最小费用最大流)

    题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...

随机推荐

  1. Java简单实验--关于课后提到的java重载函数的简单分析

    根据这一小段代码,获得了以下的测试截图: 简单分析:根据输出结果,判断这段代码用到了两个不同的函数方法,输出的不止有double类型的数,还有整型的数. 又根据类中的定义情况,square是根据判断传 ...

  2. 【Nginx】如何建立新连接

    处理新连接事件的回调函数是ngx_event_accept,原型如下: void ngx_event_accept(ngx_event_t *ev) 具体流程如下: 1)首先调用accept方法试图建 ...

  3. 【转】nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

    原文: http://blog.csdn.net/pcyph/article/details/46513521 -------------------------------------------- ...

  4. 【转】ubuntu 下安装mongodb php 拓展的方法

    按照上面的方法安装成功之后,写一个 mongodb 的php测试脚本,用来测试是否可以 正确连接上mongodb ,并查询结果. 参考:http://php.net/manual/en/class.m ...

  5. [RxJS] Chain RxJS Operators Together with a Custom `pipe` Function using Array.reduce

    Instead of writing complex operators, it's usually best to write simple, single-purpose operators th ...

  6. centos编辑界面和图形界面登陆切换设置

    输入命令 vi /etc/inittab 到最后一行.把5改成3 保存退出. 各数字的含义: #   0 - halt (Do NOT set initdefault to this)         ...

  7. 【Java 虚拟机探索之路系列】:JIT编译器

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 为 ...

  8. 【转载】在VS2008中使用WSE 3.0过程全记录

    WSE全称是Web Service Enhancement,提供了更好的安全性实现,以及大对象传输的设计. 有关WSE的一些介绍,如果不清楚,可以参考下面的链接 官方介绍:http://www.mic ...

  9. [Sciter] 1. 创建最简单的Sciter项目

    一些函数 sciter::debug_output_console _; 程序运行时自动启动一个控制台窗口,通过在_tiscript_中调用stdout.println来输出调试信息 SciterSe ...

  10. jdbc 连 oracle 12c

    jdbc 连 oracle 12c,除了连接串要书写正确(如果用PDB,可插拔数据库),必要的JDBC包也是不可或缺的. 比如我,机器本身装了个oracle 10g,然后上面有个java项目,使用jd ...