【题目大意】

Elaxia每天从寝室出发跑到学校,保证寝室编号为1,学校编号为N。 Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路口。表示路口a和路口b之间有条长度为c的街道(单向),求出最长周期的天数和满足最长天数的条件下最短的路程长度。

【思路】

拆点。我们可以将每个路口拆成两个点(i)和(i+N)。由于Ai与Bi之间有长度为C的街道,则在(Ai)和(Bi+N)之间添加一条容量为1,费用为c的边。然后对于每个Ai,添加一条(Ai+n,Ai)的边,容量为1(保证每个路口仅仅经过一次),费用为0的边。最大流即可。

要注意的是1和N不算是路口,所以(1与n+1)(n与2n)之间的边容量为INF。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
const int MAXm=+;
const int MAXn=(+)*;
const int INF=0x7fffffff;
int n,m;//十字路口数和街道数
struct node
{
int to,cap,cost,pos;
};
vector<node> E[MAXn];
int pre[MAXn],preedge[MAXn]; void addedge(int u,int v,int cap,int cost)
{
E[u].push_back((node){v,cap,cost,E[v].size()});
E[v].push_back((node){u,,-cost,E[u].size()-});
} void init()
{
scanf("%d%d",&n,&m);
for (int i=;i<m;i++)
{
int u,v,cost;
scanf("%d%d%d",&u,&v,&cost);
addedge(u,n+v,,cost);
}
for (int i=;i<=n-;i++) addedge(n+i,i,,);
addedge(n+,,INF,);
addedge(*n,n,INF,);
//建图的时候不要忘掉了,从1和n+1的边,n和2n的边容量为INF,否则只能跑一天!
} int SPFA()
{
int dis[MAXn],vis[MAXn];
for (int i=;i<=*n;i++) dis[i]=INF;
memset(vis,,sizeof(vis));
memset(pre,-,sizeof(pre));
queue<int>que;
que.push();
dis[]=;
vis[]=;
while (!que.empty())
{
int head=que.front();
que.pop();
vis[head]=;
for (int i=;i<E[head].size();i++)
{
node& tmp=E[head][i];
if (tmp.cap> && dis[tmp.to]>dis[head]+tmp.cost)
{
dis[tmp.to]=dis[head]+tmp.cost;
pre[tmp.to]=head;
preedge[tmp.to]=i;
if (!vis[tmp.to])
{
vis[tmp.to]=;
que.push(tmp.to);
}
}
}
}
if (dis[n]==INF) return ;//这里是返回到n而不是2n
else return ;
} void mcmf()
{
int ans=,days=;
while (SPFA())
{
days++;
int flow=INF;
for (int i=n;pre[i]!=-;i=pre[i])
flow=min(flow,E[pre[i]][preedge[i]].cap);
for (int i=n;pre[i]!=-;i=pre[i])
{
node& tmp=E[pre[i]][preedge[i]];
tmp.cap-=flow;
E[tmp.to][tmp.pos].cap+=flow;
ans+=flow*tmp.cost;
}
}
cout<<days<<' '<<ans<<endl;
} int main()
{
init();
mcmf();
return ;
}

【费用流】BZOJ1877[SDOI2009]-晨跑的更多相关文章

  1. bzoj1877: [SDOI2009]晨跑

    挺裸的最小费用最大流... #include<cstdio> #include<queue> #include<cstring> #include<iostr ...

  2. BZOJ1877 [SDOI2009]晨跑 【费用流】

    题目 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道 ...

  3. 【BZOJ1877】[SDOI2009]晨跑 最小费用最大流

    [BZOJ1877][SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现 ...

  4. BZOJ 1877: [SDOI2009]晨跑 费用流

    1877: [SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一 ...

  5. BZOJ 1877: [SDOI2009]晨跑( 最小费用最大流 )

    裸的费用流...拆点, 流量限制为1, 最后的流量和费用即答案. ------------------------------------------------------------------- ...

  6. 【BZOJ1877】晨跑(费用流)

    [BZOJ1877]晨跑(费用流) 题面 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在 ...

  7. BZOJ_1877_[SDOI2009]晨跑_费用流

    BZOJ_1877_[SDOI2009]晨跑_费用流 题意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出 ...

  8. [SDOI2009]晨跑[最小费用最大流]

    [SDOI2009]晨跑 最小费用最大流的板子题吧 令 \(i'=i+n\) \(i -> i'\) 建一条流量为1费用为0的边这样就不会对答案有贡献 其次是对 \(m\) 条边建 \(u'-& ...

  9. 1877: [SDOI2009]晨跑

    1877: [SDOI2009]晨跑 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2007  Solved: 1085[Submit][Status][ ...

随机推荐

  1. python进行机器学习(五)之模型打分

    一.画出模型的残差值分布情况 #!/usr/bin/python import pandas as pd import numpy as np import csv as csv import mat ...

  2. ubuntu中使用virtualbox遇到Kernel driver not installed (rc=-1908)错误

    百度之后得到解决,再此做个笔记 错误提示 Kernel driver not installed (rc=-1908) The VirtualBox Linux kernel driver (vbox ...

  3. YUV颜色编码解析(转)

    原文转自 https://www.jianshu.com/p/a91502c00fb0

  4. 关于c++的string的operator =

    在 c++ primer 5 中在说到string的章节里面有这样一句话: string s5 = "hiya"; // copy initialization 也就是说,这里说上 ...

  5. PBFT算法的相关问题

    PBFT(99.02年发了两篇论文)-从开始的口头算法(指数级)到多项式级 要求 n>3f why: 个人简单理解:注意主节点是可以拜占庭的,从节点对于(n,v,m)的投票最开始也是基于主节点给 ...

  6. C中级 消息队列设计

    引言  - 补充好开始 消息队列在游戏服务器层应用非常广泛. 应用于各种耗时的IO操作业务上.消息队列可以简单理解为 [消息队列 = 队列 + 线程安全]本文参照思路如下, 最后献上一个大神们斗法的场 ...

  7. 51Nod 1022 石子归并 V2(区间DP+四边形优化)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...

  8. mysql 库操作、存储引擎、表操作

    阅读目录 库操作 存储引擎 什么是存储引擎 mysql支持的存储引擎 如何使用存储引擎 表操作 创建表 查看表结构 修改表ALTER TABLE 复制表 删除表 数据类型 表完整性约束 回到顶部 一. ...

  9. python Mixin 是个啥?

    内容待添加... 参考文章: [1][python] Mixin 扫盲班

  10. 我感觉prometheus这种日志收集模式不错

    思想可以,可推可拉,可自己写接入点...还有报警... 按官方文档试一下安装 https://prometheus.io/docs/introduction/getting_started/