题目描述

喵呜突然想去拜访许久不见的皮卡丘。电脑前面待久了,出去一趟总想游览一番。于是喵呜骑上他的草泥马自西向东(皮卡丘居住的城市在喵呜的东边)开始他的拜访之旅。
既然想游览当然想经过更多的城市,但是马粮又很贵,所以喵呜决定不经过同一个城市两次(除了喵呜所在城市),并且不走回头路(拜访皮卡丘的路上不往家的方向走,回家的路上不往皮卡丘家的方向走)!
为了简化问题,我们假定喵呜可能经过的城市自西向东排开。喵呜的家在最西边,皮卡丘的家在最东边。将城市自西向东,从1到N编号。
喵呜出发前用他6400+MHz的大脑心算出了结果。你知道喵呜最多能经过多少城市吗?

输入格式

多组测试数据
第1行两个正整数N(2<=N<=100),M(1<=M<=4950)。N表示有N个城市。
接下来M行每行两个正整数x,y(1<=x,y<=N)。表示编号x的城市和编号y的城市有路连通。

输出

一个正整数,喵呜能经过城市的最大值。如果找不到可行路径输出1。

样例输入

8 9
1 3
1 4
4 5
5 6
6 8
7 8
3 7
3 2
3 4

样例输出

7

从起点走到终点,再走回起点,中间不能走回头路,每个点最多走一次,问最多可以走过多少个点。相当于从起点找两条路到终点,拆点后建图,求最小费用最大流即可。如果最后求得的最大流不是2,则说明无解。

#include<cstdio>
#include<map>
#include<queue>
#include<cstring>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
const int maxn = 200 + 5;
const int INF = 1000000000;
typedef long long LL;
typedef pair<LL, int> P;struct Edge {int from, to, cap, flow, cost;
};struct MCMF {int n, m, s, t;vector<Edge> edges;vector<int> G[maxn];int inq[maxn];         // 是否在队列中int d[maxn];           // Bellman-Ford,单位流量的费用int p[maxn];           // 上一条弧int a[maxn];           // 可改进量void init(int n) {this->n = n;for(int i = 0; i < n; i++) G[i].clear();edges.clear();}void AddEdge(int from, int to, int cap, int cost) {edges.push_back((Edge){from, to, cap, 0, cost});edges.push_back((Edge){to, from, 0, 0, -cost});m = edges.size();G[from].push_back(m-2);G[to].push_back(m-1);}bool BellmanFord(int s, int t, int &flow,int &cost) {for(int i = 0; i < n; i++) d[i] = INF;memset(inq, 0, sizeof(inq));d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF;queue<int> Q;Q.push(s);while(!Q.empty()) {int u = Q.front(); Q.pop();inq[u] = 0;for(int i = 0; i < G[u].size(); i++) {Edge& e = edges[G[u][i]];if(e.cap > e.flow && d[e.to] > d[u] + e.cost) {d[e.to] = d[u] + e.cost;p[e.to] = G[u][i];a[e.to] = min(a[u], e.cap - e.flow);if(!inq[e.to]) { Q.push(e.to); inq[e.to] = 1; }}}}if(d[t] == INF) return false;//s-t不连通,失败退出flow += a[t];cost += d[t] * a[t];int u = t;while(u != s) {edges[p[u]].flow += a[t];edges[p[u]^1].flow -= a[t];u = edges[p[u]].from;}return true;}// 需要保证初始网络中没有负权圈int Mincost(int s, int t, int& flow) {int cost = 0;while(BellmanFord(s, t,flow, cost));return cost;}};MCMF g;int main(){int n, m;while(scanf("%d%d", &n, &m) != EOF){g.init(2*n);int source = 0, sink = 2*n-1;while(m--){int x, y;scanf("%d%d", &x, &y);x--;y--;g.AddEdge(min(x,y)+n, max(x, y), 2, 0);}g.AddEdge(0, n, 2, -1);g.AddEdge(n-1, 2*n-1, 2, -1);for(int i = 1;i < n-1;i++){g.AddEdge(i, i+n, 1, -1);}int flow = 0;int ans = -g.Mincost(source, sink, flow);if(flow != 2)ans = 1;elseans -= 2;cout << ans << endl;}return 0;
}

喵呜的旅行(费用流)相关推荐

  1. [BZOJ 1221][HNOI2001]软件开发(费用流)

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  2. 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]

    题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai​现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi​,现在设 D ...

  3. UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)

    题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...

  4. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

  5. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...

  6. bzoj3171: [Tjoi2013]循环格(费用流)

    传送门 其实这题的建图并不难(虽然我并没有想出来) 首先,每一个点的入度和出度必须为$1$ 那么我们考虑拆点 每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则 ...

  7. 洛谷 - P2045 - 方格取数加强版 - 费用流

    原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...

  8. 【BZOJ2245】[SDOI2011]工作安排 拆边费用流

    [BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...

  9. [Bzoj1061][Noi2008]志愿者招募(费用流)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1061 一开始疯狂想dp,然后队友走过来瞄一眼就告诉我像费用流,菜的真实,jpg. 一种比 ...

  10. BZOJ 1061费用流

    思路: 我们可以列出几个不等式 用y0带进去变成等式 下-上 可以消好多东西 我们发现 等式左边的加起来=0 可以把每个方程看成一个点 正->负 连边 跑费用流即可 //By SiriusRen ...

最新文章

  1. 如何建设数字中国?人民日报推出四个整版观察
  2. 初等数论--整除--判断一个数是否是素数
  3. 如何在outlook里显示自然周的周数
  4. Composite(组合)--对象结构型模式
  5. java 区号_求您!JAVA作业,窗口查询区号!
  6. Linux进阶之路———— RPM 与 YUM 包管理
  7. Oracle数据库只读事务和无事务的区别
  8. 重启中的武汉:烟火气息回来了,消费疯狂增长
  9. python同或符号_奇技淫巧,还是正统功夫? - Python推导式最全用法
  10. 智能仓储管理系统分析?
  11. CCF201709-2 公共钥匙盒(100分)【模拟+优先队列】
  12. The Introduction Of Filter
  13. 华为荣耀10电路原理图
  14. SSM小区停车场管理系统
  15. Python 温度转换
  16. 我国正式实施不安全食品召回制度(转)
  17. linux内核软盘,软盘也成为历史文物了:Linux内核也将取消软盘驱动器的支持
  18. 编程题#4:Tomorrow never knows? C语言
  19. 安卓系统开发下载和安装JRE
  20. 树莓派通过java获取麦克风声音并播放

热门文章

  1. 基于机器学习的心脏成像诊断
  2. 字符串中汉字和数字转换成拼音
  3. 分享一次自己使用 pyecharts 模块 画地图,一路踩坑和填坑的经历
  4. [JVM]了断局: 类加载机制
  5. C语言编译出现一个警告,16种C语言编译警告(Warning)类型的解决方法
  6. 浅谈 Node.js 热更新
  7. 1076 Forwards on Weibo (30 分)
  8. centos7 安装Calibre搭建一个家用图书馆
  9. 全文检索服务ElasticSearch
  10. libcurl.lib 导入问题 须知