kruscal求最小生成树

news/2024/7/15 20:13:05 标签: 图论, 数据结构

kruscal算法:
对每条边的权值进行从小到大排序,然后从小到大取权值最小的边,如取出的边会在树中产生回路则舍去,取下一条;若不会产生回路则加入到树中。
判断是否会产生回路的方法为:在初始状态下给每个顶点赋予不同的标记,对于遍历过程的每条边,其都有两个顶点,判断这两个顶点的标记是否一致,如果一致,说明它们本身就处在一棵树中,如果继续连接就会产生回路;如果不一致,说明它们之间还没有任何关系,可以连接,同时连接后会将其顶点标记改变。

#include <iostream>
#include <algorithm>
using namespace std;
#define INF 10000
struct AGraph
{
    int edges[100][100];
    int vertex_num;
};
typedef struct
{
    int vertex1,vertex2;
    int weight;
}Edge;
bool cmp (Edge a,Edge b)
{
    return a.weight < b.weight;
}
void Kruskal(AGraph g)//Kruskal算法
{
    int i,j,k,u1,v1,sn1,sn2;
    int vset[1000];
    Edge E[1000];//存放图中的所有边
    k=0;//e数组的下标从0开始计
    for(i=0;i<g.vertex_num; i++)//由g产生边集E,不重复选取同一条边
        for(j=0;j<=i;j++)
        {
            if(g.edges[i][j]!=0&&g.edges[i][j]!=INF)
            {
                E[k].vertex1=i;E[k].vertex2=j;
                E[k].weight=g.edges[i][j];
                k++;
            }
        }
    sort(E,E+k,cmp);
    for(i=0;i<g.vertex_num; i++)//初始化辅助数组
        vset[i]=i;
    k=1;//k表示当前构造生成树的第几条边,初值为1
    j=0;//E中边的下标,初值为0
    while(k<g.vertex_num)//生成的边数小于n时循环
    {
        u1=E[j].vertex1;v1=E[j].vertex2;//取一条边的两个顶点
        sn1=vset[u1];
        sn2=vset[v1];//分别得到两个边所属的集合编号
        if(sn1!=sn2)//两顶点属于不同的集合,该边是最小生成树的一条边
        {
            
            cout<<"v"<<u1<<"  and v"<<v1<<"  to the weight -----"<<(E[j].weight)<<endl;
            k++;//生成边数增1
            for(i=0;i<g.vertex_num; i++)//两个集合统一编号
                if(vset[i]==sn2)//集合编号为sn2的改为sn1
                    vset[i]=sn1;
        }
        j++;//扫描下一条边
    }
}
int main()
{
    int i,j;
    AGraph G;
    G.vertex_num=6;
    for(i=0;i<=5;i++)
        for(j=0;j<=5;j++){
            if(i==j) G.edges[i][j]=0;
            else G.edges[i][j]=INF;
        }
    G.edges[0][1]= G.edges[1][0]=5;
    G.edges[0][2]= G.edges[2][0]=8;
    G.edges[0][3]= G.edges[3][0]=7;
    G.edges[0][5]= G.edges[5][0]=3;
    G.edges[1][2]= G.edges[2][1]=4;
    G.edges[2][3]= G.edges[3][2]=5;
    G.edges[2][5]= G.edges[5][2]=9;
    G.edges[3][4]= G.edges[4][3]=5;
    G.edges[3][5]= G.edges[5][3]=6;
    G.edges[4][5]= G.edges[5][4]=1;
    cout<<"克鲁斯卡尔算法所求的最小生成树为"<<endl;
    Kruskal(G);

}

http://www.niftyadmin.cn/n/890653.html

相关文章

pandas分析电影评分

import pandas import math import numpy#pandas要读取表格型内容 如&#xff1a;#pandas.read_sql() #pandas.read_excel()u_cols1[users_id,age,sex,job,zip_code] users_infopandas.read_csv(uers_info.txt, sep|, namesu_cols1, encodingISO-8859-1) #print(users_info)u_…

排序算法整理3

改进版冒泡排序&#xff1a;使用pos记录bound&#xff08;边界&#xff09; #include "iostream" using namespace std; void sort(int arr[],int n) {int posn;while(pos!0){int boundpos;pos0;for(int i1;i<bound;i){if(arr[i]>arr[i1]){int temparr[i1];ar…

AD2测试电路及放大电路的仿真

AD2&#xff1a; 1- &#xff0c;1 &#xff1a;对应示波器&#xff08;scope&#xff09; 2- &#xff0c;2&#xff1a;对应示波器 ⬇ &#xff0c;⬇&#xff1a;代表接地 V &#xff0c;V- &#xff1a;对应supplies (直流&#xff09; W1 ,W2: 对应信号源&#xff08;wave…

unity学习-for VR project 01

开发准备&#xff1a; 下载unity->激活许可证->创建新的项目 进入创建一个C#脚本&#xff0c;准备编程 有人相爱&#xff0c;有人夜里看海&#xff0c;有人现在还在下载VS &#xff08;没下载C#和unity插件的得接着下&#xff09; 然后到这一步就可以编程了 中间还遇到…

deep learning and baseline

得到初步的数据集 并且训练模型

unity学习-for VR project 02

最左上的一排是工具栏&#xff0c;分别移动&#xff0c;缩放&#xff0c;方向&#xff0c;pivot是模型中心&#xff0c;center是模型&#xff08;组&#xff09;重心 creat material可以改变地板的颜色 renderer 是渲染器 collider 是碰撞检测器 一些参数 albedo 反射率 后面的…

深度学习数据处理与代数基础

torch数据处理 1.标量scalar 即0阶张量 import torch xtorch.tensor([3.0]) ytorch.tensor([4.0]) print(xy) print(x*y)2.向量 vector&#xff08;一阶张量&#xff09; 即标量值组成的列表 并将这些标量值称为向量的元素(elements) 或分量&#xff08;components&#xff09…

自动求导及实现

自动求导 在我们计算 y 关于 x 的梯度之前&#xff0c;我们需要一个地方来存储梯度。 重要的是&#xff0c;我们不会在每次对一个参数求导时都分配新的内存。 import torch #创建变量x并为其分配一个初始值。、 xtorch.arange(4.0,requires_gradTrue) print(x) print(x.grad…