【费用流】【Next Array】费用流模板(spfa版)

一、非结构体版

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 #define MAXN 501
 7 #define MAXM 50001
 8 #define INF 2147483647
 9 int S,T;
10 int en,u[MAXM],v[MAXM],first[MAXN],next[MAXM],cap[MAXM],cost[MAXM];//Next Array
11 bool inq[MAXN];
12 int d[MAXN]/*spfa*/,p[MAXN]/*spfa*/,a[MAXN]/*可改进量*/;
13 queue<int>q;
14 void Init_MCMF(){memset(first,-1,sizeof(first));en=0;}
15 void AddEdge(const int &U,const int &V,const int &W,const int &C)
16 {
17     u[en]=U; v[en]=V; cap[en]=W; cost[en]=C;
18     next[en]=first[U];
19     first[U]=en++;
20     u[en]=V; v[en]=U; cost[en]=-C;
21     next[en]=first[V];
22     first[V]=en++;
23 }
24 bool Spfa(int &Flow,int &Cost)
25 {
26     memset(d,0x7f,sizeof(d));
27     memset(inq,0,sizeof(inq));
28     d[S]=0; inq[S]=1; p[S]=0; a[S]=INF; q.push(S);
29     while(!q.empty())
30       {
31           int U=q.front(); q.pop(); inq[U]=0;
32           for(int i=first[U];i!=-1;i=next[i])
33             if(cap[i] && d[v[i]]>d[U]+cost[i])
34               {
35                 d[v[i]]=d[U]+cost[i];
36                 p[v[i]]=i;
37                 a[v[i]]=min(a[U],cap[i]);
38                 if(!inq[v[i]]) {q.push(v[i]); inq[v[i]]=1;}
39               }
40       }
41     if(d[T]>2000000000) return 0;
42     Flow+=a[T]; Cost+=d[T]*a[T]; int U=T;
43     while(U!=S)
44       {
45           cap[p[U]]-=a[T]; cap[p[U]^1]+=a[T];
46           U=u[p[U]];
47       }
48     return 1;
49 }
50 int Mincost()
51 {
52     int Flow=0,Cost=0;
53     while(Spfa(Flow,Cost));
54     return Cost;
55 }

二、结构体版

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 #define MAXN 5001
 7 #define MAXM 100001
 8 #define INF 2147483647
 9 int S,T,n,m;
10 int en,first[MAXN];
11 struct NextArray{int u,v,cap,cost,next;}NA[MAXM];
12 bool inq[MAXN];
13 int d[MAXN]/*spfa*/,p[MAXN]/*spfa*/,a[MAXN]/*可改进量*/;
14 queue<int>q;
15 void Init_MCMF(){en=0;memset(first,-1,sizeof(first));}
16 void AddEdge(const int &U,const int &V,const int &W,const int &C)
17 {
18     NA[en].u=U; NA[en].v=V; NA[en].cap=W; NA[en].cost=C;
19     NA[en].next=first[U]; first[U]=en++;
20     NA[en].u=V; NA[en].v=U; NA[en].cost=-C;
21     NA[en].next=first[V]; first[V]=en++;
22 }
23 bool Spfa(int &Flow,int &Cost)
24 {
25     memset(d,0x7f,sizeof(d));
26     memset(inq,0,sizeof(inq));
27     d[S]=0; inq[S]=1; p[S]=0; a[S]=INF; q.push(S);
28     while(!q.empty())
29       {
30           int U=q.front(); q.pop(); inq[U]=0;
31           for(int i=first[U];i!=-1;i=NA[i].next)
32             if(NA[i].cap && d[NA[i].v]>d[U]+NA[i].cost)
33               {
34                 d[NA[i].v]=d[U]+NA[i].cost;
35                 p[NA[i].v]=i;
36                 a[NA[i].v]=min(a[U],NA[i].cap);
37                 if(!inq[NA[i].v]) {q.push(NA[i].v); inq[NA[i].v]=1;}
38               }
39       }
40     if(d[T]>2000000000) return 0;
41     Flow+=a[T]; Cost+=d[T]*a[T]; int U=T;
42     while(U!=S)
43       {
44           NA[p[U]].cap-=a[T]; NA[p[U]^1].cap+=a[T];
45           U=NA[p[U]].u;
46       }
47     return 1;
48 }
49 int Mincost()
50 {
51     int Flow=0,Cost=0;
52     while(Spfa(Flow,Cost));
53     return Cost;
54 }
时间: 2024-10-05 14:16:10

【费用流】【Next Array】费用流模板(spfa版)的相关文章

【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流

题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大.求两人都采取最优策略的情况下最大流及总费用. 输入 第一行三个整数N,M,P.N表示给定运输网络中节点的数量,M表示有向边的数量,P的含义见问题描述部分.为了简化问题,我们假设源点S是点1,汇点T是点N.接下来M行,每行三个整数A,B,C,表示有一条从点A到点B的有向边,其最大流量是C. 输出 第一

hdu 4289 Control(网络流 最大流+拆点)(模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1545    Accepted Submission(s): 677 Problem Description You, the head of Department o

Java API —— IO流(数据操作流 &amp; 内存操作流 &amp; 打印流 &amp; 标准输入输出流 &amp; 随机访问流 &amp; 合并流 &amp; 序列化流 &amp; Properties &amp; NIO)

1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出流写入稍后由数据输入流读取的数据. · DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. package datastreamdemos; import java.io.*; /** * Created b

node中的可读流和可写流

javascript的一个不足之处是不能处理二进制数据,于是node中引入了Buffer类型.这个类型以一个字节(即8位)为单位,给数据分配存储空间.它的使用类似于Array,但是与Array又有不同:Buffer在定义的时候必须明确知道其长度,但是Array的长度是可以动态变化的.定义Buffer有三种方式: 1. var buf = new Buffer(3);//指定buffer占用3个字节 2. var buf = new Buffer("hello","utf-8&

Java学习总结(7)——(File类,IO流,(缓冲流,转换流等),Properties类)

一.File类 java.io.File类代表系统文件(文件和目录) 访问文件属性步骤 (1)创建文件对象 格式:File file=new File(String pathname); (2)调用方法:操作文件目录的属性(路径,权限,日期和时间等) File类的属性(separator默认名称分隔符) (1)在UNIX系统上,此字段的值为 '/ ';在window系统上,它为'\' (2)为了程序的跨平台性,文件的路径应该用这个属性值来代表 File类的常用方法 方法名称 说明 Boolean

黑马程序员—IO(一)流概述、字符流、字节流、流操作规律

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:Inp

黑马程序员——IO流概述、字符流、字节流、流操作规律(一)

第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:InputStream和OutputStream 2)字符流的抽象基流:Reader和Writer 注:此四个

Java I/O流操作(二)---缓冲流[转]

转自:http://blog.csdn.net/johnny901114/article/details/8710403 一.BufferWriter类 IO的缓冲区的存在就是为了提高效率,把要操作的数据放进缓冲区,然后一次性把缓冲区的内容写到目的地,而不是写一次就往目的地写一次. 在这里要注意的是当我们关闭了缓冲区对象实际也关闭了与缓冲区关联的流对象. BufferWriter类 try { FileWriter fw =new FileWriter("test.txt"); //使

GOLDENGATE安装配置与复制流搭建_DG端抽取支持DDL版

GOLDENGATE安装配置与复制流搭建_DG端抽取支持DDL版 1.配置场景     OGG版本11.2.1.0.1 2.OGG软件安装 2.1 源端和目标端创建OGG安装目录与授权 #mkdir /u01/ogg #chown –R oracle:oinstall /u01/ogg #chmod –R 777 /u01/ogg 2.2 源端和目标端OS层参数调整与配置环境变量 (1)OS参数调整 #vi /etc/sysctl.conf net.core.rmem_max=8388608 n