HDU1301 Jungle Roads(克鲁斯卡尔算法版)

简介:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301

通过对数组构造一个静态链表,将在同一个连通分量中的顶点链接起来。对按边权值从大到小排序后的边集合逐条进行判断,若边的起点和终点分别在不同的连通分量链表中(这通过获取其所在链表的表尾元素是否是同一个来进行判定),则此边加入最小生成树的边集合中,并将边的终点加入到边的起点所在的静态链表中。最终所有结点都会链接到一个静态链表中。

复制代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std ;

const int MAX_VETEXT_NUM = 26;//最大的顶点数
const int MAX_EDGE_NUM = 75;//最大的边数

struct Edge
{
    int begin;//起点
    int end;//结点
    double cost;//边的权值
};

Edge edge[MAX_EDGE_NUM];//边集合
double sum = 0;
int ConnectedList[MAX_VETEXT_NUM];//连通分量静态链表
int nEdges; //边的数目
int nVetexs; //顶点数目

int FindInConnectList( int Point[] , int v)
{//若v所在的连通分量静态链表为空,则返回参数v,否则返回其所在链表的表尾元素,
    int i = v ;
    while ( Point[i] > 0 ) 
        i = Point[i];
    return i ;
}

bool cmp( const Edge& a , const Edge& b )
{//根据边权值从小到大排序
    return a.cost < b.cost ;
}

void Kruscal()
{
    int i , j ; 
    int v1 , v2 ;
    //初始化连通分量静态链表
    for ( i = 0 ; i < nVetexs ; i++ )
    {
        ConnectedList[i] = 0 ;
    }
    i = 0 ; j = 0 ; 
    while ( j < nVetexs - 1 && i < nEdges )
    {
        v1 = FindInConnectList( ConnectedList , edge[i].begin) ;
        v2 = FindInConnectList( ConnectedList , edge[i].end) ;

        if ( v1 != v2)
        {//起点和终点不在同一个连通分量重
            sum += edge[i].cost;
            ConnectedList[v1] = v2 ;//加入连通分量链表中
            ++j;//最小生成树边数加1
        }
        ++i;//处理完一条边
    }
}

int main()
{
    int i , j ;
    int num ;
    double cost ;
    char chStart , chEnd;
    while ( cin >> nVetexs && nVetexs != 0)
    {
        sum = 0 ; 
        nEdges = 0 ;
        for ( i = 0 ; i < nVetexs - 1 ; i ++ )
        {
            cin >> chStart >> num ;
            for( j = 0 ; j < num ; j ++ )
            {
                cin >> chEnd >> cost ;
                edge[nEdges].begin = chStart - 'A' ;
                edge[nEdges].end = chEnd - 'A' ;
                edge[nEdges].cost = cost ;
                nEdges ++;
            }
        }
        sort(edge , edge + nEdges, cmp) ;
        Kruscal() ;
        cout << sum << endl ;   
    }
    return 0 ; 
}
复制代码



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/09/13/1566016.html,如需转载请自行联系原作者
目录
打赏
0
0
0
0
60
分享
相关文章
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
**摘要:** 了解9种距离和相似度算法:欧氏距离、余弦相似度、汉明距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、雅卡尔指数、半正矢距离和Sørensen-Dice系数。这些算法在机器学习、文本分析、图像处理和生物学等领域各有应用。例如,欧氏距离用于KNN和K-Means,余弦相似度用于文本相似性,汉明距离在错误检测中,曼哈顿距离在数据挖掘,切比雪夫距离在棋盘游戏,闵可夫斯基距离通过调整参数适应不同场景,雅卡尔指数和Sørensen-Dice系数用于集合相似度。每种算法有其优缺点,如欧氏距离对异常值敏感,余弦相似度忽略数值大小,汉明距离仅适用于等长数据。
269 2
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
转:克鲁斯卡尔算法在文档管理软件中应用使其更加高效
克鲁斯卡尔算法是一种用于解决最小生成树问题的贪心算法。在文档管理软件中,可以将网络节点之间的连接关系抽象为一张图,然后使用克鲁斯卡尔算法来寻找最小生成树,即最小的连接所有节点的路径。
107 0
转:电子文档管理系统中应用克鲁斯卡尔算法有什么作用
克鲁斯卡尔算法是一种求解最小生成树问题的算法,其在电子文档管理系统中可以用于优化文档的管理和存储。
82 0
转:克鲁斯卡尔算法在电子文档管理系统中的应用
克鲁斯卡尔算法能够找到连接所有节点的最小生成树,从而找到最优解。在电子文档管理系统中,这意味着可以通过算法找到最佳的文档组织方式,提高文档检索的效率和精度。
353 0
蓝桥杯(聪明的猴子)克鲁斯卡尔算法最小生成树
蓝桥杯(聪明的猴子)克鲁斯卡尔算法最小生成树
135 0
转:克鲁斯卡尔算法在电脑监控软件中的应用
在电脑监控软件中,使用克鲁斯卡尔算法可以帮助管理员更好地了解整个网络的拓扑结构,找出网络中潜在的问题和风险点。
352 0
Kruskal算法(克鲁斯卡尔)最小生成树
Kruskal算法(克鲁斯卡尔)最小生成树
163 0
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
本程序基于免疫算法实现物流仓储点选址优化,并通过MATLAB 2022A仿真展示结果。核心代码包括收敛曲线绘制、最优派送路线规划及可视化。算法模拟生物免疫系统,通过多样性生成、亲和力评价、选择、克隆、变异和抑制机制,高效搜索最优解。解决了物流仓储点选址这一复杂多目标优化问题,显著提升物流效率与服务质量。附完整无水印运行结果图示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等