算法上机4(多段图的最小成本问题,资源分配问题)

1.多段图的最小成本问题

#include<iostream>

using namespace std;

#define LEN sizeof(struct NODE)

#define N 20

#define MAX_TYPE 10000

#define ZERO_TYPE 0

struct NODE

{

int v_num;

int len;

struct NODE *next;

};

NODE *node = new NODE[N];

int cost[N];

int *route = new int[N];

int path[N];

int fgragh(int n)

{

int i;

struct NODE *pnode;

int *path = new int[n];

int min_cost, *cost = new int[n];

// 初始化

for (i = 0; i < n; i++)

{

cost[i] = MAX_TYPE;

path[i] = -1;

route[i] = 0;

}

cost[n - 1] = ZERO_TYPE;

// 分段决策

for (i = n - 2; i >= 0; i--)

{

pnode = node[i].next;

while (pnode != NULL) {

if (pnode->len + cost[pnode->v_num] < cost[i])

{

cost[i] = pnode->len + cost[pnode->v_num];

path[i] = pnode->v_num;

}

pnode = pnode->next;

}

}

// 进行全局的最优决策

i = 0;

while ((route[i] != n - 1) && (path[i] != -1))

{

i++;

route[i] = path[route[i - 1]];

}

min_cost = cost[0];

cout << "最短路径为:";

for (int j = 0; j <= i; j++)

cout << route[j] << " ";

printf("\n");

delete path;

delete cost;

return min_cost;

}

int main()

{

int m, t, i, l, u, v, distant;

cout << "输入顶点数和边数:" << endl;

cin >> m;//顶点数

cin >> t;//边数

cout << "初始化邻接链表:" << endl;

for (i = 0; i < m; i++)

node[i].next = NULL;

struct NODE *p;

for (i = 0; i < t; i++)

{

cin >> u >> v >> l;

p = new NODE;

p->v_num = v;

p->len = l;

p->next = node[u].next;

node[u].next = p;

}

distant = fgragh(m);

cout << "最小成本为:"<<distant<<endl;

system("pause");

}

  1. 资源分配问题

#include <stdio.h>

#include <stdlib.h>

#define N 100

int alloc(int n, int m, int G[N][N], int optq[N]) {

int optx, optg, k, i, j, s;

int q[N];

int d[N][N];

int f[N][N];

int g[N];

for (i = 0; i <= m; i++) {

f[0][i] = G[0][i];

d[0][i] = i;

}

for (i = 1; i < n; i++) {

f[i][0] = G[i][0] + f[i - 1][0];

d[i][0] = 0;

for (j = 1; j <= m; j++) {

f[i][j] = f[i][0];

d[i][j] = 0;

for (s = 0; s <= j; s++) {

if (f[i][j] < G[i][s] + f[i - 1][j - s]) {

f[i][j] = G[i][s] + f[i - 1][j - s];

d[i][j] = s;

}

}

}

}

printf("分配的份额:\n");

printf("x\t");

for (i = 0; i <= m; i++)

printf("%d\t", i);

printf("\n");

for (i = 0; i < n; i++) {

printf("f%d(x):\t", i + 1);

for (j = 0; j <= m; j++)

printf("%d\t", f[i][j]);

printf("\n");

printf("d%d(x):\t", i + 1);

for (j = 0; j <= m; j++)

printf("%d\t", d[i][j]);

printf("\n");

}

for (i = 0; i < n; i++) {

g[i] = f[i][0];

q[i] = 0;

for (j = 1; j <= m; j++) {

if (g[i] < f[i][j]) {

g[i] = f[i][j];

q[i] = j;

}

}

}

optg = g[0];

optx = q[0];

k = 0;

for (i = 1; i < n; i++) {

if (optg < g[i]) {

optg = g[i];

optx = q[i];

k = i;}}

if (k < n - 1)

for (i = k + 1; i < n; i++)

optq[i] = 0;

for (i = k; i >= 0; i--) {

optq[i] = d[i][optx];

optx -= optq[i];}

return optg;}

int main() {

int n, m, i, j;

int G[N][N];

int optq[N];

printf("请输入工程数目和工程份额:\n");

scanf("%d,%d", &n, &m);

printf("请输入各份额资源分配给各工程所获得的利润:\n");

for (i = 0; i < n; i++) {

printf("工程%d:\n", i + 1);

for (j = 0; j <= m; j++)

scanf("%d", &G[i][j]);}

printf("最大利润是:%d\n", alloc(n, m, G, optq));

for (i = 0; i < n; i++)

printf("分配给第%d个工程的最优份额为:%d\n", i + 1, optq[i]);

system("pause");

return 0;

}

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值