~~~题面~~~

题解:

第一眼费用流,,然后想了好久怎么建图,,,最后发现是最小费用可行流的板子题。。。。

其实还没有很懂这个算法,所以这里只是摆一下步骤,以后再补理解吧。

首先一个思路就是转换图,将有上下限的图变为普通的网络流图,然后再跑费用流。

所以建图其实和有上下界的网络流一样的。。。

1,首先建立超级源点汇点ss和tt

2,对于原图中每一条边x ---> y,设其上下界为(l, r),费用为cost,那么连边的时候将流量变为r - l即可

3,对于任意点i,记d[i]为它的富余流量,即入度的下界和 - 出度的下界和。

  若d[i] > 0,则连边ss ----> i, 流量为d[i] , 费用0

  若d[i] < 0,则连边i ----> tt,流量为-d[i],费用0

4,连边t ---> s,流量inf,费用0

答案即为ans + 所有边下界 * 边的费用

其实可以感性的理解为先有了一个不一定合法的解(下界*费用),然后再利用费用流使用最小的代价使得答案合法。

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 400
#define ac 100000
#define inf 2139062143
#define getchar() *o++
char READ[], *o = READ;
int n, ans, s, t1, t;
int last[AC], dis[AC], disflow[AC], d[AC];
int date[ac], Next[ac], haveflow[ac], cost[ac], Head[AC], tot = ;
bool z[AC];
deque<int> q; inline int read()
{
int x=;char c=getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline void add(int f,int w,int S,int C)
{
date[++tot] = w, Next[tot] = Head[f], haveflow[tot] = S, cost[tot] = C, Head[f] = tot;
date[++tot] = f, Next[tot] = Head[w], cost[tot] = -C, Head[w] = tot;
//printf("%d %d %d %d\n",f,w,S,C);
} void pre()
{
int a,b,c;
n=read();
t1 = n + , s = n + , t = n + ;
for(R i=;i<=n;i++)
{
a=read();
for(R j=;j<=a;j++)
{
b=read(),c=read();
--d[i], ++d[b];
ans += c;
add(i, b, inf, c);
}
}
for(R i=;i<=n;i++)
add(i, t1, inf, );
for(R i=;i<=n;i++)
{
if(d[i] > ) add(s, i, d[i], );
if(d[i] < ) add(i, t, -d[i], );
}
add(t1, , inf, );//是费用为0!
} inline void aru()
{
int x = t;
while(x != s)
{
haveflow[last[x]] -= disflow[t];
haveflow[last[x] ^ ] += disflow[t];
x = date[last[x] ^ ];
}
ans += disflow[t] * dis[t];
} bool spfa()
{
int x, now;
dis[s] = , disflow[s] = inf, z[s] = true;
q.push_front(s);
while(!q.empty())
{
x = q.front();
q.pop_front();
z[x] = false;//标记出列
for(R i=Head[x]; i ;i=Next[i])
{
now = date[i];
if(haveflow[i] && dis[now] > dis[x] + cost[i])
{//要有流量啊
dis[now] = dis[x] + cost[i];
last[now] = i;
disflow[now] = min(disflow[x], haveflow[i]);
if(!z[now])
{
z[now] = true;
if(!q.empty() && dis[now] < q.front()) q.push_front(now);
else q.push_back(now);
}
}
}
}
if(dis[t] != inf) aru();
return dis[t] != inf;
} bool spfa1()
{
int x,now;
z[s]=true,dis[s]=,disflow[s]=inf;
q.push_front(s);
while(!q.empty())
{
x=q.front();
q.pop_front();
z[x]=false;
for(int i=Head[x]; i ;i=Next[i])
{
now=date[i];
if(haveflow[i] && dis[now]>dis[x]+cost[i])
{
dis[now]=dis[x]+cost[i];
last[now]=i;
disflow[now]=min(disflow[x],haveflow[i]);//以点为单位记录到这个点时的流量
if(!z[now])
{
z[now] = true;
q.push_front(now);
}
/*if(!z[now] && now!=t)
{
if(!q.empty() && dis[now]<dis[q.front()]) q.push_front(now);
else q.push_back(now);
z[now]=true;
}*/
}
}
}
//更新路径
if(dis[t] != inf) aru();
return dis[t] != inf;
} void work()
{
//printf("%d\n",ans);
memset(dis, , sizeof(dis));
while(spfa())
memset(dis, , sizeof(dis));
printf("%d\n",ans);
} int main()
{
// freopen("in.in","r",stdin);
fread(READ, , , stdin);
pre();
work();
// fclose(stdin);
return ;
}

[AHOI2014/JSOI2014]支线剧情 有上下界费用流的更多相关文章

  1. bzoj3876: [Ahoi2014&Jsoi2014]支线剧情(上下界费用流)

    传送门 一道题让我又要学可行流又要学zkw费用流…… 考虑一下,原题可以转化为一个有向图,每次走一条路径,把每一条边都至少覆盖一次,求最小代价 因为一条边每走过一次,就要付出一次代价 那不就是费用流了 ...

  2. 【BZOJ3876】[Ahoi2014]支线剧情 有上下界费用流

    [BZOJ3876][Ahoi2014]支线剧情 Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩 ...

  3. BZOJ3876[Ahoi2014&Jsoi2014]支线剧情——有上下界的最小费用最大流

    题目描述 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费 ...

  4. BZOJ3876 AHOI/JSOI2014支线剧情(上下界网络流)

    原图所有边下界设为1上界设为inf花费为时间,那么显然就是一个上下界最小费用流了.做法与可行流类似. 因为每次选的都是最短路增广,且显然不会有负权增广路,所以所求出来的可行流的费用就是最小的. #in ...

  5. BZOJ 3876: [Ahoi2014]支线剧情 [上下界费用流]

    3876: [Ahoi2014]支线剧情 题意:每次只能从1开始,每条边至少经过一次,有边权,求最小花费 裸上下界费用流...每条边下界为1就行了 注意要加上下界*边权 #include <io ...

  6. 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情

    题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...

  7. bzoj3876: [Ahoi2014&Jsoi2014]支线剧情

    题意:给一幅图,从1开始,每条边有边权最少走一遍,可以在任意点退出,问最小花费 题解:上下界费用流,每个边都流一遍,然后为了保证流量平衡,新建源点汇点,跑费用流把流量平衡 /************* ...

  8. BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)

    题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...

  9. BZOJ2324 ZJOI2011营救皮卡丘(floyd+上下界费用流)

    虽然不一定每次都是由编号小的点向编号大的走,但一个人摧毁的顺序一定是从编号小的到编号大的.那么在摧毁据点x的过程中,其只能经过编号小于x的点.并且这样一定合法,因为可以控制其他人先去摧毁所经过的点.那 ...

随机推荐

  1. swoole 相关

    安装虚拟机 VMware Workstation Pro 安装CentOS CentOS-7-x86_64-Minimal-1708.iso 安装FinalShell 教程地址 安装lnmp 教程地址 ...

  2. == vs === in Javascript

    本文来自网易云社区 作者:魏文庆 如果你只想知道==与===的区别,请直接看总结,当然我更希望您能耐心看完全文.Javascript中用于相等比较的操作符有两个==和===.==我们通常称为" ...

  3. PHP调用wsdl接口实例化SoapClient抛出异常

    异常:Message:SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://*****?wsdl' : failed to load externa ...

  4. 「日常训练」Duff in the Army (Codeforces Round #326 Div.2 E)

    题意(CodeForces 588E) 给定一棵\(n\)个点的树,给定\(m\)个人(\(m\le n\))在哪个点上的信息,每个点可以有任意个人:然后给\(q\)个询问,每次问\(u\)到\(v\ ...

  5. Ubuntu卡在logo界面

    对于这个问题,我也是在最近一次偶然的机会中发现的. 我重装了了Ubuntu 18.04, 很多东西需要重新配置,  有个刚性需求就是配置shadowsocks实现***,对于从windows向linu ...

  6. Linux命令应用大词典-第9章 数字计算

    9.1 bc:任意精度的计算器 9.2 dc:一个任意精度的计算器 9.3 expr:将表达式的值打印到标准输出 9.1 bc:任意精度的计算器 9.2 dc:一个任意精度的计算器 9.3 expr: ...

  7. C#使用EF连接PGSql数据库

    前言 由于项目需要,使用到了PGSql数据库,说实话这是第一次接触并且听说PGSql(PostgreSQL)关系型数据库,之前一直使用的都是SqlServer,一头雾水的各种找资源,终于将PGSql与 ...

  8. tomcat 运行机制

    先不去关技术细节,对一个servlet容器,我觉得它首先要做以下事情:1:实现Servlet api规范.这是最基础的一个实现,servlet api大部分都是接口规范.如request.respon ...

  9. HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)

    Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...

  10. 【转】jQuery的deferred对象详解

    jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...