http://uoj.ac/problem/179

补充那一列修改方法:

对于第i行:

  $$xi=bi-\sum Aij*xj$$

         $$=bi-\sum_{j!=e} Aij*xj-Aie*xe$$

Pivot后应该是: $$=bi-\sum_{j!=e} Aij*xj-Aie*xl$$

假设第l行已经算对转轴后的系数

则$$xl=bl-\sum Alj*xj$$

所以$$xi=bi-\sum_{j!=e} Aij*xj-Aie*(bl-\sum Alj*xj)$$

$$=bi-Aie*bl-\sum_{j!=e}(Aij-Aie*Alj)*xj-(0-Aie*Alj*xj)$$

观察变化:

可以看出,所有系数只要-Aie*Alj就好了的。因为Aie会在过程中变化,所以一开始先存起来,然后置为0。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
#define Maxn 25
const double eps=0.00000001,INF=1e15; int n,m; int id[Maxn*2];
double a[Maxn][Maxn];
//第一维是限制,B集合
//第二维是元素,N集合
//a[0][xx] -> c 目标函数系数
//a[xx][0] -> b 限制等式常数
//a[xx][yy] -> A 限制等式系数向量
//最大化 sigma(ci*xi),i属于N
//限制 xj=bj-sigma(aji*xi) ,j属于B double myabs(double x) {return x>0?x:-x;} void Pivot(int l,int e)
{
//转轴l和e
swap(id[n+l],id[e]);
double t=a[l][e];a[l][e]=1;
for(int j=0;j<=n;j++) a[l][j]/=t;
for(int i=0;i<=m;i++) if(i!=l&&myabs(a[i][e])>eps)
{
t=a[i][e];a[i][e]=0;
for(int j=0;j<=n;j++) a[i][j]-=a[l][j]*t;
}
} //初始化-辅助问题
bool init()
{
while(1)
{
int e=0,l=0;
for(int i=1;i<=m;i++) if(a[i][0]<-eps&&(!l||(rand()&1))) l=i;
if(!l) break;
for(int j=1;j<=n;j++) if(a[l][j]<-eps&&(!e||(rand()&1))) e=j;
if(!e) {printf("Infeasible\n");return 0;}
Pivot(l,e);
}
return 1;
} //最优化
bool simplex()
{
while(1)
{
int l=0,e=0;double mn=INF;
for(int j=1;j<=n;j++)
if(a[0][j]>eps) {e=j;break;}
if(!e) break;//如果目标变量c都小于0 找到答案
for(int i=1;i<=m;i++) if(a[i][e]>eps&&a[i][0]/a[i][e]<mn)
mn=a[i][0]/a[i][e],l=i;//找a[i][0]/a[i][e]最小的i进行转轴
if(!l) {printf("Unbounded\n");return 0;}
//如果所有的a[i][e]都小于0,说明最优值正无穷
Pivot(l,e);
}
return 1;
} double ans[Maxn]; int main()
{
srand(time(0));
int t;
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++) scanf("%lf",&a[0][i]);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
scanf("%lf",&a[i][0]);
}
for(int i=1;i<=n;i++) id[i]=i;
if(init()&&simplex())
{
printf("%.8lf\n",-a[0][0]);
if(t)
{
for(int i=1;i<=m;i++) ans[id[n+i]]=a[i][0];
for(int i=1;i<=n;i++) printf("%.8lf ",ans[i]);
}
}
return 0;
}

  

2017-03-14 21:01:07

【UOJ 179】 #179. 线性规划 (单纯形法)的更多相关文章

  1. 【UOJ #179】线性规划 单纯形模板

    http://uoj.ac/problem/179 终于写出来了单纯性算法的板子,抄的网上大爷的qwq 辅助线性规划找非基变量时要加个随机化才能A,我也不知道为什么,卡精度吗? 2017-3-6UPD ...

  2. 【UOJ#179】线性规划 单纯形

    题目链接: http://uoj.ac/problem/179 Solution 就是单纯形模板题,这篇博客就是存一下板子. Code #include<iostream> #includ ...

  3. bzoj3118: Orz the MST(线性规划+单纯形法)

    传送门 不难发现,对于每一条树边肯定要减小它的权值,对于每一条非树边要增加它的权值 对于每一条非树边\(j\),他肯定与某些树边构成了一个环,那么它的边权必须大于等于这个环上的所有边 设其中一条边为\ ...

  4. bzoj3265: 志愿者招募加强版(线性规划+单纯形法)

    传送门 鉴于志愿者招募那题我是用网络流写的所以这里还是写一下单纯形好了-- 就是要我们求这么个线性规划(\(d_{ij}\)表示第\(i\)种志愿者在第\(j\)天能不能服务,\(x_i\)表示第\( ...

  5. Oracle汉字转拼音package

    --函数GetHzFullPY(string)用于获取汉字字符串的拼音 --select GetHzFullPY('中华人民共和国') from dual; --返回:ZhongHuaRenMinGo ...

  6. 通过PowerShell获取Windows系统密码Hash

    当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大 ...

  7. [模仿][JS]新浪财经7*24直播

    使用新浪财经7*24直播的数据 简单的做一个山寨品 在线地址:[痛苦啊,有GFW,却没有vpn,往heroku上传浪费了好多时间...] http://wangxinsheng.herokuapp.c ...

  8. 【bzoj1061】 Noi2008—志愿者招募

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 (题目链接) 题意 给定n天,第i天需要ai个志愿者,有m类志愿者,每类志愿者工作时间为[l, ...

  9. BZOJ3118 : Orz the MST

    对于树边显然只需要减少权值,对于非树边显然只需要增加权值 设i不为树边,j为树边 X[i]:i增加量 X[j]:j减少量 C[i]:修改1单位i的代价 对于每条非树边i(u,v),在树上u到v路径上的 ...

随机推荐

  1. (一)Hadoop1.2.1安装——单节点方式和单机伪分布方式

    Hadoop1.2.1安装——单节点方式和单机伪分布方式 一.   需求部分 在Linux上安装Hadoop之前,需要先安装两个程序: 1)JDK 1.6(或更高版本).Hadoop是用Java编写的 ...

  2. 最常用的8款 PHP 调试工具,你用过吗?

    Web 开发并不是一项轻松的任务,有超级多服务端脚本语言提供给开发者,但是当前 PHP 因为具有额外的一些强大的功能而越来越流行.PHP 是最强大的服务端脚本语言之一,同时也是 Web 开发者和设计者 ...

  3. 【洛谷 P2553】 [AHOI2001]多项式乘法(FFT)

    题目链接 简单处理一下输入,\(fft\)模板题. #include <cstdio> #include <cmath> #include <algorithm> ...

  4. 阿里云一键web环境包

    下载地址:https://files.cnblogs.com/files/wordblog/af3a48ef-3a13-479e-85c9-ead61173126c.zip 先把安装包传到服务器上用w ...

  5. 2017百越杯反序列化writeup

    去年的了,之前也有研究过.只是因为感觉PHP反序列化挺好玩的所以就再研究了一遍.总之感觉反序列化漏洞挺好玩的. 题目代码: <?php class home{ private $method; ...

  6. appium===浮窗无法定位的解决办法

    这个问题比较常见,而且不被重视.大多数人的解决思路是根据坐标,把它点掉. 如下图,根本无法定位出“你好”这个元素: 最后的解决办法是: 在desired_caps={}中增加, desired_cap ...

  7. linux设置时区同步时间

    linux设置时区同步时间 一.运行tzselect sudo tzselect 在这里我们选择亚洲 Asia,确认之后选择中国(China),最后选择北京(Beijing) 如图:   二.复制文件 ...

  8. linux配置samba服务【原创】

    转载请注明出处http://www.cnblogs.com/paul8339/p/7509981.html 需求,windows服务器访问linux的共享文件,需要linux服务器安装并配置samba ...

  9. 21.Merge Two Sorted Lists---《剑指offer》面试17

    题目链接:https://leetcode.com/problems/merge-two-sorted-lists/description/ 题目大意: 给出两个升序链表,将它们归并成一个链表,若有重 ...

  10. jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素)

    jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素) $("ul").append("<li cla ...