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 ;
}
#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 ;
}
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
分类:
ACM
posted on 2009-09-13 23:10 Phinecos(洞庭散人) 阅读(1234) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2008-09-13 近期工作小结