点此看题面

大致题意: 有一张\(DAG\),经过每条边有一定时间,从\(1\)号点出发,随时可以返回\(1\)号点,求经过所有边的最短时间。

无源汇有上下界网络流

这是无源汇有上下界网络流的板子题。

可以先去看看这道题学习一下无源汇有上下界可行流的基本知识:【LOJ115】无源汇有上下界可行流

我们对于题目中的每条边,在网络流图中连容量下界为\(1\)、容量上界为\(INF\)、代价为经过其时间的边。

对于除\(1\)号点外的每个点,在网络流图中将其向\(1\)连容量下界为\(0\)、上界为\(INF\)、代价为\(0\)的边。

然后,我们按照上面这题的套路处理一下建好网络流图。

接下来我们可以发现,这就是要求最小费用可行流。

那就把可行流中原本的最大流改成最小费用最大流即可。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 300
#define K 5000
#define INF 1e9
using namespace std;
int n;
template<int PS,int ES> class NetFlow//网络流
{
private:
#define add(x,y,f,c) (addE(x,y,f,c),addE(y,x,0,-c))
#define addE(x,y,f,c) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y,e[ee].F=f,e[ee].C=c)
#define El(x) ((((x)-1)^1)+1)
int Ct,S,T,ee,p[PS+5],lnk[PS+5],lst[PS+5],F[PS+5],C[PS+5],Iq[PS+5];queue<int> q;
struct edge {int to,nxt,F,C;}e[2*ES+5];
I bool SPFA()//SPFA找增广路
{
RI i,k;for(i=1;i<=n+2;++i) F[i]=C[i]=INF;C[S]=0,q.push(S),Iq[S]=1;
W(!q.empty())
{
for(Iq[k=q.front()]=0,q.pop(),i=lnk[k];i;i=e[i].nxt) e[i].F&&C[k]+e[i].C<C[e[i].to]&&
(
F[e[i].to]=min(F[k],e[i].F),C[e[i].to]=C[k]+e[i].C,lst[e[i].to]=i,
!Iq[e[i].to]&&(q.push(e[i].to),Iq[e[i].to]=1)
);
}return F[T]!=INF;
}
public:
I void Add(CI x,CI y,CI Mn,CI Mx,CI c) {add(x,y,Mx-Mn,c),p[x]-=Mn,p[y]+=Mn,Ct+=Mn*c;}//建边
I void Solve()
{
RI x;S=n+1,T=n+2;for(RI i=1;i<=n;++i) p[i]>0&&add(S,i,p[i],0),p[i]<0&&add(i,T,-p[i],0);//建边使其满足流量平衡
W(SPFA()) {Ct+=F[T]*C[T],x=T;W(x^S) e[lst[x]].F-=F[T],e[El(lst[x])].F+=F[T],x=e[El(lst[x])].to;}//跑最小费用最大流
printf("%d",Ct);//输出答案
}
};NetFlow<N+2,2*N+K> Fl;
int main()
{
RI i,x,y,z;for(scanf("%d",&n),i=1;i<=n;++i)
for(scanf("%d",&x);x;--x) scanf("%d%d",&y,&z),Fl.Add(i,y,1,INF,z);//对于边建边
for(i=2;i<=n;++i) Fl.Add(i,1,0,INF,0);return Fl.Solve(),0;//对于点建边
}

最新文章

  1. 疯狂Android讲义 - 学习笔记(七)
  2. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
  3. Java文件操作工具类(复制、删除、重命名、创建路径)
  4. Classes and Objects :类和对象(1)
  5. ios数据缓存方法
  6. PHP include 和 require
  7. Mac OS下SVN的使用:服务的和客户端
  8. 纠错:基于FPGA串口发送彩色图片数据至VGA显示
  9. NFS服务器的安装与配置
  10. CSS3之border-radius圆角
  11. GWAS研究中case和control的比例是有讲究的?
  12. ThreadPoolExecutor解析
  13. zookeeper的搭建和简单的使用
  14. QA
  15. MT【215】集合中元素个数
  16. charCodeAt() 和charAt()
  17. [thymeleaf] - 1.Thymeleaf是什么
  18. Bootstrap 4正式发布还有意义吗?
  19. 团队作业——Alpha冲刺 8/12
  20. MarkChanges: Jmeter

热门文章

  1. 使用 github pages快速部署自己的静态网页
  2. CF750G New Year and Binary Tree Paths(DP)
  3. spider-通过scrapyd网页管理工具执行scrapy框架
  4. python解释器和环境安装
  5. pytorch_13-图像处理之skimage
  6. centos7之firewalld防火墙的配置与使用
  7. PHPStorm设置等号对齐
  8. VMWare 虚拟机启动报“内部错误”的解决办法
  9. 【语义分割】Stacked Hourglass Networks 以及 PyTorch 实现
  10. 科技风商务项目管理PPT模板