(第 6 题)题目描述: 图的广度优先搜索 描述: 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接点的邻接点。如此进行下去,直到所有的结点都访问为止。在该题中,假定所有的结点以“A”--“Z”中的若干字符表示,且要求结点的访问顺序要求根据由“A”至“Z”的字典顺序进行访问。例如有如下图: 如果要求从H开始进行广度优先搜索,则搜索结果为:H->A->E->K->U. 输入: 输入只包含一个测试用例,第一行为一个自然数n,表示顶点的个数,第二行为n个大写字母构成的字符串,表示顶点,接下来是为一个n*n大小的矩阵,表示图的邻接关系。数字为0表示不邻接,否则为相应的边的长度。 最后一行为一个字符,表示要求进行广度优先搜索的起始顶点。 输出: 用一行输出广度优先搜索结果,起始点为给定的顶点,各顶点之间用一个空格隔开。要求同一顶点的邻接点的访问顺序按“A”---“Z”的字典顺序。 样例输入: 5 HUEAK 0 0 2 3 0 0 0 0 7 4 2 0 0 0 0 3 7 0 0 1 0 4 0 1 0 H 样例输出: H A E K U,用C语言来编写
时间: 2024-03-23 20:37:24 浏览: 139
数据结构anyview答案
+ x22 + x23 <= 5;
x31 + x32 + x33 <= 3;
x11 + x12 + x13 <= 3;
x21 + x22 + x23 <= 2;
x31 + x32 + x33 <= 5;
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 26
#define INF 0xx11 + x21 <= 3;
x12 + x22 <= 2;
x13 + x23 <= 5;
x313f3f3f3f
int n; // 顶点数量
char vertex[MAX_N + 1]; // + x32 <= 4;
x21 + x31 <= 5;
x22 + x32 <= 4;
x23 + x 顶点数组
int graph[MAX_N][MAX_N]; // 图
int vis[MAX_N]; // 标记是否访问33 <= 3;
x11 >= 0;
x12 >= 0;
x13 >= 0;
x21 >= 0;
过
char queue[MAX_N]; // 队列
int front = 0, rear = 0; // 队列头尾x22 >= 0;
x23 >= 0;
x31 >= 0;
x32 >= 0;
x33 >= 0指针
// 比较两个字符的大小
int cmp(char a, char b) {
return a - b;
}
//;
end
```
分析和总结:
根据Matlab和Lingo的结果,该公司应该将3个产品 将字符 c 入队列
void enqueue(char c) {
queue[rear++] = c;
}
// 出队列
char dequeue() {
return queue[front++];
}
// 判断队列是否为空
int is_empty() {
return front == rear;
}
//从工厂A运输到仓库Y,将1个产品从工厂B运输到仓库X,将2个 广度优先搜索
void bfs(char start) {
memset(vis, 0, sizeof(vis)); // 将 vis 数组清产品从工厂B运输到仓库Z,将4个产品从工厂C运输到仓库X,将1零
front = rear = 0; // 初始化队列
int start_index = start - 'A'; // 起个产品从工厂C运输到仓库Y,将2个产品从工厂C运输到仓库Z。这始顶点的下标
vis[start_index] = 1; // 标记起始顶点已访问
样可以满足所有客户需求,同时总成本最小,即14。该运输计划可以帮助公司 enqueue(start); // 将起始顶点入队列
// 遍历队列中的元素
while (!is实现最优化运输,减少成本,提高效率。
3. 投资问题
假设一个投资_empty()) {
char cur_vertex = dequeue(); // 取出队列头部元素
printf("%c ", cur_vertex);人有100万的可用资金,他可以将资金投资在股票、债券和房地产三种投资方式中。根据过去的经验,他预计在未来一年中,股票、债券和 // 访问该顶点
// 遍历当前顶点的邻接点
for (int i = 0;房地产的收益率分别为20%、10%和15%。他希望最大化收益。请 i < n; i++) {
// 如果邻接点未被访问且与当前顶点相邻接
if (!问他应该如何进行资金分配?
建模过程:
目标函数:maximize 0.2x1vis[i] && graph[cur_vertex - 'A'][i]) {
vis[i] = 1; // 标记邻接点 + 0.1x2 + 0.15x3
约束条件:
- x1 + x2 + x3 <=已访问
enqueue(vertex[i]); // 将邻接点入队列
}
}
}
}
int main() 100
- x1 >= 0
- x2 >= 0
- x3 >= 0
其中,x1表示 {
scanf("%d", &n);
// 读入顶点数组
scanf("%s", vertex);
// 读投资在股票的金额,x2表示投资在债券的金额,x3表示投资在房地产的入图的邻接矩阵
for (int i = 0; i < n; i++) {
for (int j金额。
Matlab代码:
```matlab
f = [-0.2 -0.1 -0.15];
A = [1 = 0; j < n; j++) {
scanf("%d", &graph[i][j]);
if (graph[i][j 1 1];
b = [100];
lb = [0 0 0];
ub = [Inf Inf Inf];
[x,fval] == 0 && i != j) {
graph[i][j] = INF; // 无连接的顶点之间] = linprog(f,A,b,[],[],lb,ub)
```
Lingo代码:
```lingo
max = 0.2距离为正无穷
}
}
}
// Floyd 算法求任意两点之间的最短路径x1 + 0.1x2 + 0.15x3;
x1 + x2 + x3 <= 100;
for (int k = 0; k < n; k++) {
for (int i = 0; i < nx1 >= 0;
x2 >= 0;
x3 >= 0;
end
```
分析和总结:
根; i++) {
for (int j = 0; j < n; j++) {
if (graph[i][k] +据Matlab和Lingo的结果,该投资人应该将40万投资在股票,30万投资在 graph[k][j] < graph[i][j]) {
graph[i][j] = graph[i][k] + graph[k][j债券,30万投资在房地产。这样可以获得最大收益,即13万。这个模];
}
}
}
}
// 读入起始顶点
char start;
scanf(" %c",型可以帮助投资人制定更加合理的资金分配策略,降低风险,提高收 &start);
// 执行广度优先搜索
bfs(start);
return 0;
}
```
阅读全文