线性规划解方格取数问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计与分析实验七线性规划解方格取数问题

(1)实验题目

在一个有m*n个方格的棋盘中,每个方格中有一个随机正整数。现要从方

格中取数,使任意两个数所在的方格没有公共边,且取出的数的总和最大。利

用线性规划,设计一个满足要求的取数算法

输入:由文件名为input.txt的文本文件提供,第一行有两个正整数m和n,分别表示棋盘的行数和列数,从第二行开始,每行有n个正整数,表示棋盘方

格中的数

输出:输出到文件output.txt,第一行为取数的最大总和

(2)实验目的

1.掌握贪婪法的思想和用法。

2.学会用贪婪法编写程序。

(3)调试通过并正确执行给定功能要求的实验代码

#include

#include

#define N 10010

#define M 400010

#include

#include

#include

#include

const int inf = 0x3f3f3f3f;

struct E

{

int to, frm, nxt, cap;

}edge[M];

int head[N],e,n,m,src,des;

int dep[N], gap[N];

void addedge(int u, int v, int w)

{

edge[e].frm = u;

edge[e].to = v;

edge[e].cap = w;

edge[e].nxt = head[u];

head[u] = e++;

edge[e].frm = v;

edge[e].to = u;

edge[e].cap = 0;

edge[e].nxt = head[v];

head[v] = e++;

}

int que[N];

void BFS()

{

memset(dep, -1, sizeof(dep));

memset(gap, 0, sizeof(gap));

gap[0] = 1;

int front = 0, rear = 0;

dep[des] = 0;

que[rear++] = des;

int u, v;

while (front != rear)

{

u = que[front++];

front = front%N;

for (int i=head[u]; i!=-1; i=edge[i].nxt) {

v = edge[i].to;

if (edge[i].cap != 0 || dep[v] != -1) continue;

que[rear++] = v;

rear = rear % N;

++gap[dep[v] = dep[u] + 1];

}

}

}

int cur[N],stack[N];

int Sap()

{

int res = 0;

BFS();

int top = 0;

memcpy(cur, head, sizeof(head));

int u = src, i;

while (dep[src] < n*m+1)

{

if (u == des)

{

int temp = inf, inser = n;

for (i=0; i!=top; ++i)

if (temp > edge[stack[i]].cap)

{

temp = edge[stack[i]].cap;

inser = i;

}

for (i=0; i!=top; ++i)

{

edge[stack[i]].cap -= temp;

edge[stack[i]^1].cap += temp;

}

res += temp;

top = inser;

u = edge[stack[top]].frm;

}

if (u != des && gap[dep[u] -1] == 0)

break;

for (i = cur[u]; i != -1; i = edge[i].nxt)

if (edge[i].cap != 0 && dep[u] == dep[edge[i].to] + 1) break;

if (i != -1)

{

cur[u] = i;

stack[top++] = i;

u = edge[i].to;

}

else

{

int min = n*m+3;

for (i = head[u]; i != -1; i = edge[i].nxt)

{

if (edge[i].cap == 0)

continue;

if (min > dep[edge[i].to])

{

min = dep[edge[i].to];

cur[u] = i;

}

}

--gap[dep[u]];

++gap[dep[u] = min + 1];

if (u != src)

u = edge[stack[--top]].frm;

}

}

return res;

}

int main()

{

FILE *in=fopen("input.txt","rt");

FILE *out=fopen("output.txt","w+");

FILE *in1=fopen("input.txt","w+");

int a[N][N]={0},m,n,i,j,c;

srand((unsigned)time(NULL));

m=rand()%10+1;

n=rand()%10+1;

for(i=0;i

for(j=0;j

a[i][j]=rand()%10+1;

for(i=0;i

{

for(j=0;j

fprintf(in1,"%d ",a[i][j]);

相关文档
最新文档