- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验3 贪心算法和回溯法
一、实验目的
1. 理解最小生成树算法——Prim算法和Kruskal算法的基本思想,学会编程实现这两种算法;
2. 理解并查集的特点与适用环境,学会使用并查集解决常见的问题;
3. 理解单源最短路径算法——Dijkstra算法的基本思想,学会编程实现Dijkstra算法;
4.
二、实验内容
1. 编程
输入:编号及边权重。0
0 2 15
1 2 50
输出:生成树例
0 1 10
0 2 15
源代码:
2. 在某个城市里住着n个人,现在给定关于这n个人的m条信息(即某2个人认识)。假设所有认识的人一定属于同一个单位,请计算该城市最多有多少单位?
输入:个值表示总人数第值信息数第开始的例
10 4
2 3
4 5
4 8
5 8
输出:个数例:源代码:
3. 编程实现Kruskal算法。
:编号及边权重。0
0 2 15
1 2 50
输出:生成树例
0 1 10
0 2 15
源代码:
#include iostream
#include algorithm
using namespace std;
typedef struct
{
int x, y;
int w;
}edge;
const int MAX = 26;
edge e[MAX * MAX];
int rank[MAX];/* ]x的秩 */
int father[MAX];/*x的父节点 */
int sum; /*存储最小生成树的总权重 */
/* 排序函数 */
bool cmp(const edge a, const edge b)
{
return a.w b.w;
}
/* 初始化集合 */
void make_set(int x)
{
father[x] = x;
rank[x] = 0;
}
/* 查找x元素所在的集合 */
int find_set(int x)
{
if (x != father[x])
{
father[x] = find_set(father[x]);
}
return father[x];
}
/* 合并x,y所在的集合 */
void union_set(int x, int y, int w)
{
if (x == y) return;
if (rank[x] rank[y])
{
father[y] = x;
}
else
{
if (rank[x] == rank[y])
{
rank[y]++;
}
father[x] = y;
}
sum += w; //记录权重
}
int main()
{
int i, j, k, m, n, t;
char ch;
while(cin m m != 0)
{
k = 0;
for (i = 0; i m; i++) make_set(i); //初始化集合,m为顶点个数
//对后m-1进行逐行处理
for (i = 0; i m - 1; i++)
{
cin ch n; //获取字符(顶点)
for (j = 0; j n; j++)
{
cin ch e[k].w; //获取权重
e[k].x = i;
e[k].y = ch - A;
k++;
}
}
sort(e, e + k, cmp); //数组进行排序
sum = 0;
for (i = 0; i k; i++)
{
union_set(find_set(e[i].x), find_set(e[i].y), e[i].w);
}
cout sum endl;
}
return 0;
4. 编程实现Dijkstra算法。
:第值表示个数,第值边个数开始为边权重。:
5 7
0 1 10
0 3 30
0 4 100
1 2 50
2 4 10
3 2 20
3 4 60:每一个顶点的最短路径长度。例
0 10 50 30 60
源代码:
5. 使用法求解问题。
:个数例
4
输出:总方案数:
0 1 0 0
0 0 0 2
3 0 0 0
0 0 4 0
0 0 1 0
2 0 0 0
0 0 0 3
0 4 0 0
----------------
总方案数为2源代码:
6. 使用法求解背包问题。
:例 {6,3,6,5,4},重量[] = {2,2,4,6,5},背包重量10。
输出:例:
总价值=源代码:
3
文档评论(0)