首页 > 技术文章 > 线性规划

lnzwz 2020-10-23 15:56 原文

网络流,差分约束可以转化。
单纯形法,复杂度未知。
这个代码就是把系数放到(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]);
}

例题:

推荐阅读