ZBLOG

修改代码细节以及出现取值不合法情况 void Pathofwealth(ALDirNetwork& graph, int*& path, int*& ans, int index, int final, int& danger, int& wealth, int& maxwealth,int &k) { if (danger >= 100) return; else if (index == final) { if (wealth > maxwealth) ...

根据你提供的代码,我注意到几个需要修改的地方和一些可能引起取值不合法情况的问题:

  1. Pathofwealth 函数中,数组 pathans 的初始化使用了 memset 函数,但是这样只能将每个元素都设置为 -1。然而,在后续的代码中,你需要遍历这两个数组,并假设 -1 代表路径或答案的结束。所以,在初始化这两个数组时,最好使用循环逐个赋值或者使用动态数组初始化方式。

  2. MaxWealthOfPath 函数中,在动态分配内存给 pathans 数组后,请记得在函数结束时释放这些内存,即使用 delete[] path; delete[] ans;

  3. 在进行递归调用时,请确保传递正确的参数。在你的代码中,应该是将下一个顶点 adjvex 作为参数传递给 Pathofwealth 函数,而不是当前顶点索引 index。所以应该是 Pathofwealth(graph, path, ans, adjvex, final, danger, wealth, maxwealth,k);

  4. 当获取财富值时,建议使用指针或引用方式传递财富值参数(int& w),而不是通过返回值来获取。

  5. 如果存在多条路径具有相同的最大财富值,则只会输出其中一条路径。如果需要输出所有具有最大财富值的路径,则需要对代码进行修改。

  6. 在调用 GetElem 函数获取顶点元素时,建议检查返回值,确保顶点索引有效。

  7. 注意回溯时应将 adjvex 设置为未访问状态(graph.SetVisitedTag(adjvex, UNVISITED);),而不是将当前顶点设置为未访问状态。所以可以修改为 graph.SetVisitedTag(index, UNVISITED);

以下是修改后的代码示例:

void Pathofwealth(ALDirNetwork<char, int>& graph, int* path, int* ans, int index, int final, int& danger, int& wealth, int& maxwealth,int &k)
{
	if (danger >= 100) return;
	else if (index == final)
	{
		if (wealth > maxwealth)
		{
			for (int i = 0; i < graph.GetVexNum(); i++)
			{
				ans[i] = path[i];
			}
			maxwealth = wealth;
		}
		return;
	}

	int adjvex = graph.GetFirstAdjvex(index);
	while (adjvex != -1)
	{
		if (graph.GetVisitedTag(adjvex) == UNVISITED)
		{
			int weight = graph.GetWeight(index, adjvex);
			danger += weight;

			int w;
			graph.GetWealth(adjvex,w);
			wealth += w;

			graph.SetVisitedTag(adjvex, VISITED);
			path[k++] = adjvex;

			Pathofwealth(graph, path, ans, adjvex, final,danger , wealth,maxwealth,k);

			danger -= weight;
			wealth -= w;
			k--;
			graph.SetVisitedTag(adjvex, UNVISITED);
		}

		adjvex = graph.GetNextAdjvex(index, adjvex);
	}
}

void MaxWealthOfPath(ALDirNetwork<char, int>& graph)
{
	int final = graph.GetVexNum() - 1;
	int* path = new int[graph.GetVexNum()];
	int* ans = new int[graph.GetVexNum()];

	for (int i = 0; i < graph.GetVexNum(); ++i) {
		path[i] = -1;
		ans[i] = -1;
	}

	int danger = 0;
	int wealth = 0;
	int maxwealth = 0;
	int index = 0;
	int k = 1;

	graph.SetVisitedTag(0, VISITED);
	path[0] = 0;

	Pathofwealth(graph, path, ans,index ,final ,danger ,wealth ,maxwealth,k );

	cout << "The Max Wealth of Path is:" << endl;

	int i = 0;

	while (ans[i] != -1)
	{
		char ch;

    if (graph.GetElem(ans[i], ch)) {
        cout << ch << " ";
    }

		i++;
	}
	cout << endl;

	delete[] path;
	delete[] ans;
}

请注意,这只是对你提供的代码的一些修改建议,如果还有其他问题或需求,请随时告诉我。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=10577

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?