我由衷地为我的朋友高兴。哈哈,yian,当你nick name破百上千时,再打“蒟蒻”就会被打的。

  好的,说正事吧。请注意,这还是题解。但我发现,网络流实在是太套路了(怪不得这两年几乎销声匿迹)。我们将分析两道题目,分别代表两类稍微有一点思想意义的题目。

  啊啊啊啊啊。


3438: 小M的作物

Description

小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可以获得ai的收益,在B中种植可以获得bi的收益,而且,现在还有这么一种神奇的现象,就是某些作物共同种在一块耕地中可以获得额外的收益,小M找到了规则中共有m种作物组合,第i个组合中的作物共同种在A中可以获得c1i的额外收益,共同总在B中可以获得c2i的额外收益,所以,小M很快的算出了种植的最大收益,但是他想要考考你,你能回答他这个问题么?

Input

第一行包括一个整数n
第二行包括n个整数,表示ai第三行包括n个整数,表示bi第四行包括一个整数m接下来m行,
对于接下来的第i行:第一个整数ki,表示第i个作物组合中共有ki种作物,
接下来两个整数c1i,c2i,接下来ki个整数,表示该组合中的作物编号。

Output

只有一行,包括一个整数,表示最大收益

Sample Input

3
4 2 1
2 3 2
1
2 3 2 1 2

Sample Output

11
样例解释A耕地种1,2,B耕地种3,收益4+2+3+2=11。
1<=k< n<= 1000,0 < m < = 1000 保证所有数据及结果不超过2*10^9。

  这道题可能代表了BZOJ上的一类题,就像之前所说过的BZOJ 3894 文理分科一样,与BZOJ 1497 [NOI2006]最大获利也颇有类似之处。

  这是最大负权回路:

  而此题则是另一种策略。好水啊。


1877: [SDOI2009]晨跑

Description

Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等等,不过到目前为止,他坚持下来的只有晨跑。 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道,Elaxia只能从 一个十字路口跑向另外一个十字路口,街道之间只在十字路口处相交。Elaxia每天从寝室出发 跑到学校,保证寝室编号为1,学校编号为N。 Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以 在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路 口。Elaxia耐力不太好,他希望在一个周期内跑的路程尽量短,但是又希望训练周期包含的天 数尽量长。 除了练空手道,Elaxia其他时间都花在了学习和找MM上面,所有他想请你帮忙为他设计 一套满足他要求的晨跑计划。

Input

第一行:两个数N,M。表示十字路口数和街道数。 
接下来M行,每行3个数a,b,c,表示路口a和路口b之间有条长度为c的街道(单向)。
N ≤ 200,M ≤ 20000。

Output

两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长度。

Sample Input

7 10
1 2 1
1 3 1
2 4 1
3 4 1
4 5 1
4 6 1
2 5 5
3 6 6
5 7 1
6 7 1

Sample Output

2 11

  啊啊啊。这是典型的费用流。因为限制访问次数,所以需要拆点,其间边流量为1(源点汇点为inf)费用为0。点之间正常连边,边流量为1(我最开始想用inf,结果因为各种原因WA了)费用为题中所述的c。
  费用流其实就是反复做普通的SPFA(用cost作边权),不过更新时需保证u->v这条弧的cap>flow,另需多维护其来路,其流量。然后flow加上汇点t的流量增量,cost加上汇点t的流量增量*汇点t到源点s的距离(路径cost之和)。然后一条一条边倒回去,处理各边的flow。
  挂个代码吧。
 /**************************************************************
Problem: 1877
User: Doggu
Language: C++
Result: Accepted
Time:1484 ms
Memory:4856 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm> const int N = ;
const int M = ;
struct Edge {int v,u,upre,cap,flow,cost;}g[M];
int head[N], ne=-;
inline void adde(int u,int v,int cap,int cost) {
g[++ne]=(Edge){v,u,head[u],cap,,cost},head[u]=ne;
g[++ne]=(Edge){u,v,head[v],,,-cost},head[v]=ne;
} int d[N], p[N], a[N];
bool inq[N];
#include <queue>
std::queue<int> q;
bool SPFA(int s,int t,int &flow,int &cost) {
while(!q.empty()) q.pop();
memset(inq,,sizeof(inq));
memset(d,/,sizeof(d));
q.push(s);inq[s]=;d[s]=;p[s]=;a[s]=0x3f3f3f3f;
while(!q.empty()) {
int u=q.front();q.pop();inq[u]=;
for( int i = head[u]; i!=-; i=g[i].upre ) {
int v=g[i].v;
if(g[i].cap>g[i].flow&&d[v]>d[u]+g[i].cost) {
if(!inq[v]) q.push(v),inq[v]=;
d[v]=d[u]+g[i].cost;p[v]=i;a[v]=std::min(a[u],g[i].cap-g[i].flow);
}
}
}
if(d[t]==d[N-]) return false;
flow+=a[t];cost+=d[t]*a[t];
int u = t;
while(u != s) {
g[p[u]].flow+=a[t];
g[p[u]^].flow-=a[t];
u=g[p[u]].u;
}
return true;
}
void MxfMnc(int s,int t) {
int flow = , cost = ;
while(SPFA(s,t,flow,cost));
printf("%d %d\n",flow,cost);
} int main() {
memset(head,-,sizeof(head));
int n, m, a, b, c;scanf("%d%d",&n,&m);
adde(,n+,0x3f3f3f,);for( int i = ; i < n; i++ ) adde(i,n+i,,);
for( int i = ; i <= m; i++ ) {
scanf("%d%d%d",&a,&b,&c);
adde(n+a,b,,c);
}
MxfMnc(,n);
return ;

费用流

BZOJ 3438 小M的作物 & BZOJ 1877 [SDOI2009]晨跑的更多相关文章

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

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

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

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

  3. 1877: [SDOI2009]晨跑

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

  4. BZOJ 3438: 小M的作物( 最小割 )

    orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ---------------------------------------------------------- ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1877 费用流做多了,此题就是一眼题. 拆点表示只能经过一次,容量为1,费用为0. 然后再连边即可,跑 ...

  6. bzoj 3438: 小M的作物

    Description 背景 小M还是个特么喜欢玩MC的孩纸... 描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一 ...

  7. BZOJ 1877 [SDOI2009]晨跑(多条不交叉最短路)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1877 [题目大意] 找出最多有几条点不重复的从1到N的路,并且要求在满足这个条件的情况 ...

  8. bzoj 1877: [SDOI2009]晨跑

    #include<cstdio> #include<iostream> #include<cstring> #define M 6009 #define inf 2 ...

  9. bzoj 1877 [SDOI2009]晨跑(最小费用最大流)

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

随机推荐

  1. 在IIS中部署Asp.Net网站

    在IIS中部署Asp.Net网站 1.添加IIS或者删除IIS,在控制面板=>程序和功能=>打开或关闭功能 启动iis,右键计算机=>管理=>服务和应用程序=>Inter ...

  2. jQuery的基本使用

    一.jQuery简介 jQuery是一个快速.简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动 ...

  3. Docker部署Golang

    1. 安装docker 2. mkdir myDocker 3.  cd myDocker && touch Dockerfile 4.  Dockerfile写入 # 将golang ...

  4. 时间戳使用的bug,你见过么

    博主本人前几天给公司项目里写了个禁言和解除禁言的功能,项目中涉及到对时间的处理,因为学得时候也没很注意,就按自己的思路去写了,运行起来发现了一个天大的bug,就是写的延后一年尽然,刚开始就执行了,而且 ...

  5. printf命令详解

    基础命令学习目录首页 本文是Linux Shell系列教程的第(八)篇,更多shell教程请看:Linux Shell系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中 ...

  6. PLSQL Developer windows 64位连接数据库的问题

    使用PLSQL Developer 工具连接到数据库进行开发,目前主流windows 系统都是64位操作系统,而PLSQL Developer  只有32位程序,所以在连接数据库上遇到一些问题. PL ...

  7. 5233杨光--Linux第一次实验

    学习计时:共14小时 读书:2小时 代码:7小时 作业:2小时 博客:3小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用Li ...

  8. 在onResume()中调用getIntent()得不到Extra的问题

    之前 想做activity间的传值,注意 不是 startActivityforResult的那种, 在启动了多层activity再次启动activity想进入到singleTask的MainActi ...

  9. Internet History, Technology and Security (Week6)

    Week6 The Internet is desinged based on four-layer model. Each layer builds on the layers below it. ...

  10. p4 : a problem about "./behavioral-model"

    当sudo ./behavioral-moel时候会发生这个 这个时候记得要先在 p4factory目录下先执行一下这个 sudo ./tools/veth_setuo.sh 再去执行sudo ./b ...