线性规划
网络流,差分约束可以转化。
单纯形法,复杂度未知。
这个代码就是把系数放到(1n)*(1m)。
把约束条件放到第0列。最大化的系数放到第0行。
对偶:就是处理大于等于。
把矩阵转置即可。
void pivot(int x,int y)
{
double t=sz[x][y];sz[x][y]=1;
for(int i=0;i<=m;i++)
sz[x][i]/=t;
for(int i=0;i<=n;i++)
{
if(i==x||fabs(sz[i][y])<eps)
continue;
t=sz[i][y];sz[i][y]=0;
for(int j=0;j<=m;j++)
sz[i][j]-=t*sz[x][j];
}
}
int simple()
{
while(1)
{
int x=-1,y=-1;
for(int i=1;i<=m;i++)
{
if(sz[0][i]>eps&&x==-1)
x=i;
}
if(x==-1)
break;
for(int i=1;i<=n;i++)
{
if(sz[i][x]<eps)
continue;
if(y==-1||sz[i][0]/sz[i][x]<sz[y][0]/sz[y][x])
y=i;
}
pivot(y,x);
}
return -floor(sz[0][0]);
}
例题: