算法分析与程序设计-作业一

1.问题。
在一个无向图G=(V,E)中,(u,v)代表连接顶点u与顶点v的边,而w(u,v)代表此边的权重,若存在T为E的子集且无循环图,使得w(T)最小,则此T为G的最小生成树。
在这里插入图片描述
2. 解析
Prim算法:
在这里插入图片描述
Kruskal算法:
在这里插入图片描述
3. 设计。
Prim:
void prim(int x) {//参数为默认的初始访问点
visit[x] = 1;//visit数组判断是否被访问,1为被访问过,0为未被访问过
for (多次循环) {
min = 1000;//每次初始化min
for (遍历所有点)
{
if (如果该点被访问过) {
for (temp = first[i]; temp; temp = temp->link) //搜索与该点相关的边
{
if (该边已经取到了)
{
continue;
}
else if (该边的权重比min小)
{
min = temp->quan;
minbiao = temp->nextbiao;//更新min和下标
}
}
}
}
visit[minbiao] = 1;
sumweight = sumweight + min;
}
printf_s(“the minmum weight is %d.”, sumweight);
}
Kruskal:
void Kruskal() {
scanf_s("%d", &v);//输出边的数量
for (int i = 0; i < MAXG; i++)//初始化parent数组
{
parent[i] = -1;
}
for (int i = 0; i < v; i++)//输入图
{
scanf_s("%d %d %d", &edge[i].a, &edge[i].b, &edge[i].weight);
//a,b为边的两个顶点,weight为权重
}
for (int i = 0; i < v; i++)//对权重进行排序
{
for (int j = 1; j < v - i; j++)
{
if (edge[j].weight < edge[j - 1].weight)
{
//交换edge[j]和edge[j-1]的a,b,weight
}
}
}
int sumweight = 0;
for (遍历所有边)
{
if (edge[i].a和edge[i].b可以合并) {
sumweight = sumweight + edge[i].weight;
}
else
{
continue;
}
}
printf_s(“the minmum weight is %d.”, sumweight);
}
4.分析。
T(n)=O(E+vlogv)
5.源码。
地址:https://github.com/jcm111859242/-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值