单纯性与网络流

单纯性模板:

需要b > 0, xi > 0.

 1 // 单纯性
 2 // n+1 * m+1 矩阵
 3 // 1~n 为约束 <= 右值
 4 // n+1为目标最大值
 5 // 对偶化直接转置即可
 6 const int maxn = 1100, maxm = 11000;
 7 const double eps = 1e-7, INF = 1e20;
 8 int dcmp(double a) { return fabs(a)<eps?0:a<0?-1:1; }
 9 int n , m;
10 double a[maxm][maxn];
11 void pivot(int l , int e){
12     for(int i = 1; i <= n; i++) if(i != l&&dcmp(a[i][e])){
13         for(int j = 1; j <= m; j++)
14             if(j != e) a[i][j] -= a[i][e]/a[l][e]*a[l][j];
15         a[i][e] /= -a[l][e];
16     }
17     for(int i = 1; i <= m; i++) if(i != e) a[l][i] /= a[l][e]; a[l][e] = 1/a[l][e];
18 }
19
20 double simplex(){
21     double mn;
22     int e , l;
23     while(1){
24         for(e=1;e<m;e++) if(dcmp(a[n][e]) > 0) break;
25         if(e == m) return -a[n][m];
26         mn = INF;
27         for(int i=1;i<n;i++) if(dcmp(a[i][e]) > 0 && mn > a[i][m]/a[i][e]) mn = a[l=i][m]/a[i][e];
28         if(mn == INF) return INF;
29         pivot(l, e);
30     }
31 }

bzoj1061

题意:有n天,第i天需要ai个志愿者,有m类志愿者,每类志愿者工作时间为[l,r],花费为ci,求最小花费

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 1100, maxm = 11000;
 5 const double eps = 1e-7, INF = 1e20;
 6 int dcmp(double a) { return fabs(a)<eps?0:a<0?-1:1; }
 7 int n , m;
 8 double a[maxm][maxn];
 9 void pivot(int l , int e){
10     for(int i = 1; i <= n; i++) if(i != l&&dcmp(a[i][e])){
11         for(int j = 1; j <= m; j++)
12             if(j != e) a[i][j] -= a[i][e]/a[l][e]*a[l][j];
13         a[i][e] /= -a[l][e];
14     }
15     for(int i = 1; i <= m; i++) if(i != e) a[l][i] /= a[l][e]; a[l][e] = 1/a[l][e];
16 }
17
18 double simplex(){
19     double mn;
20     int e, l;
21     while(1){
22         for(e=1;e<m;e++) if(dcmp(a[n][e]) > 0) break;
23         if(e == m) return -a[n][m];
24         mn = INF;
25         for(int i=1;i<n;i++) if(dcmp(a[i][e]) > 0 && mn > a[i][m]/a[i][e]) mn = a[l=i][m]/a[i][e];
26         if(mn == INF) return INF;
27         pivot(l, e);
28     }
29 }
30
31 int main() {
32     scanf("%d%d", &n, &m);
33     //对偶化
34     for(int i = 1; i <= n; i++)
35         scanf("%lf", &a[m+1][i]);
36     for(int i = 1, l, r, v; i <= m; i++) {
37         scanf("%d%d%d" , &l, &r, &v);
38         for(int j = l; j <= r; j++) a[i][j] = 1;
39         a[i][n+1] = v;
40     }
41     n++, m++;
42     swap(n, m);
43     printf("%d" , (int)(simplex()+0.50));
44     return 0;
45 }

时间: 2025-01-02 15:48:17

单纯性与网络流的相关文章

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int inf=0x3f3f3f3f; 6 const int sink=30; 7 8 struct Edge 9 { 10 int to; 11 int next; 12 int capacity; 13 14 void assign(int t,int n,int c) 15 { 16 to=t; next=n; ca

Simplex单纯性算法的Python实现

单纯性算法是解决线性规划的经典方法,上世纪50年代就提出了,其基本思想是在可行域内沿着边遍历所有的顶点,找出最优值,即为算法的最优值. 算法的执行过程如下: 求出初始基向量 构建单纯性表格 在所有非基向量对应的c中,找出一个最小的ci,若该ci大于0,则退出,输出obj,否则将ai入基 利用基向量组线性表示ai,得到该线性表示的系数向量Λ 对于Λ中所有大于0的分量,求出minmj=1bjΛj对应的j,然后将aj出基 问题矩阵旋转,即通过高斯行变换,将ai变换成aj 如果ci全大于0,则退出算法,

UVA 1306 - The K-League(网络流)

UVA 1306 - The K-League 题目链接 题意:n个球队,已经有一些胜负场,现在还有一些场次,你去分配胜负,问每支球队有没有可能获胜 思路:网络流公平分配模型,把场次当作任务,分配给人,然后先贪心,枚举每个人,让这些人能赢的都赢,剩下的去建图,每个源点连向比赛容量为场次,每个比赛连向2个球队,容量无限大,每个球队连向汇点,容量为每个的人的总和减去当前已经赢的,建完图跑一下最大流,然后判断源点流出的是否都满流即可 代码: #include <cstdio> #include &l

hdu 4975 A simple Gaussian elimination problem.(网络流,判断矩阵是否存在)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 Problem Description Dragon is studying math. One day, he drew a table with several rows and columns, randomly wrote numbers on each elements of the table. Then he counted the sum of each row and col

POJ训练计划3422_Kaka&#39;s Matrix Travels(网络流/费用流)

解题报告 题目传送门 题意: 从n×n的矩阵的左上角走到右下角,每次只能向右和向下走,走到一个格子上加上格子的数,可以走k次.问最大的和是多少. 思路: 建图:每个格子掰成两个点,分别叫"出点","入点", 入点到出点间连一个容量1,费用为格子数的边,以及一个容量∞,费用0的边. 同时,一个格子的"出点"向它右.下的格子的"入点"连边,容量∞,费用0. 源点向(0,0)的入点连一个容量K的边,(N-1,N-1)的出点向汇点连一

HDU 3488Tour(网络流之最小费用流)

题目地址:hdu3488 这题跟上题基本差不多啊....详情请戳这里. 另外我觉得有要改变下代码风格了..终于知道了为什么大牛们的代码的变量名都命名的那么长..我决定还是把源点与汇点改成source和sink吧..用s和t太容易冲突了...于是如此简单的一道题调试到了现在..sad... 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #

LibreOJ #6002. 「网络流 24 题」最小路径覆盖

内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 网络流 最大流 屠龙宝刀点击就送 #include <cstring> #include <cstdio> #include <queue> #define N 6005 #define inf 0x3f3f3f3f using namespace std; bool flag[N]; int n,m,dep[N],nextt[N<

POJ 1273 Drainage Ditches (网络流Dinic模板)

Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage