克鲁斯卡尔算法(Kruskal)模板
来源:互联网 发布:阿里云oss挂载ecs 编辑:程序博客网 时间:2024/04/28 15:41
转载于:http://escorter.blogbus.com/logs/35108198.html
克鲁斯卡尔算法的基本思想:
考虑问题的出发点: 为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小。
具体做法: 先构造一个只含 n 个顶点的子图 SG,然后从权值最小的边开始,若它的添加不使SG 中产生回路,则在 SG 上加上这条边,如此重复,直至加上 n-1 条边为止。
判断是否产生回路可以用并查集
每次用选择权边最小的边可以用优先队列
#include <iostream>
#include <queue>
using namespace std;
const long Max=101;
struct node
{
long from;
long to;
long cost;
};
int set[Max];
priority_queue<node> q;
bool operator <(const node &a, const node &b)
{
return a.cost>b.cost;
}
long find(long x)
{
long i=x,r=x,j;
while(set[r]!=r)
r=set[r];
while(i!=r)
{
j=set[i];
set[i]=r;
i=j;
}
return r;
}
void merge(long a,long b)
{
long x,y;
x=find(a);
y=find(b);
if(x!=y)
set[x]=y;
}
long Kruskal()
{
long rs=0,i;
node e;
for(i=0;i<Max;i++)
set[i]=i;
while(!q.empty())
{
e=q.top();
q.pop();
if(find(e.from)!=find(e.to))
{
merge(e.from,e.to);
rs+=e.cost;
}
}
return rs;
}
int main()
{
/*
while(!q.empty()) //清空
{
q.pop();
}
while(m--) //边数
{
scanf("%ld%ld%ld",&e.from,&e.to,&e.cost);
q.push(e);
swap(e.from,e.to);//无向图
q.push(e);
}
rs=Kruskal();
printf("%ld\n",rs);
}
return 0;*/
}
- 克鲁斯卡尔算法(Kruskal)模板
- 克鲁斯卡尔(Kruskal)算法
- 克鲁斯卡尔(Kruskal)算法
- kruskal克鲁斯卡尔算法
- 克鲁斯卡尔算法(Kruskal)
- 克鲁斯卡尔(Kruskal)算法
- (Kruskal)克鲁斯卡尔算法
- kruskal's algorithm.[克鲁斯卡尔算法]
- [数据结构]克鲁斯卡尔(Kruskal)算法
- Kruskal(克鲁斯卡尔)
- 克鲁斯卡尔Kruskal
- Kruskal(克鲁斯卡尔) 最小生成树 算法详解+模板
- 普利姆(prim)算法和克鲁斯卡尔(kruskal)算法
- 普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法
- Prim(普利姆)算法+Kruskal(克鲁斯卡尔)算法
- 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法
- 最小生成树-kruskal算法(克鲁斯卡尔算法)
- 最小生成树---克鲁斯卡尔kruskal算法
- APK反编译软件apktool
- VB.NET中的文本框
- Eclipse怎样安装插件
- 2011年年度总结
- HDU1689 Just a Hook
- 克鲁斯卡尔算法(Kruskal)模板
- 拒绝平庸——浅谈Web登录页面设计
- 第一座月球核电站明年问世
- Android用户体验团队:Android UI设计准则
- 驱动调试中怎么样让windbg停在DriverEntry
- Unix网络编程代码 第28章 原始套接字
- 我来了, 计算机!!!
- 浅谈:国内软件公司为何无法做大做强?
- 【最短路+dijkstra】杭电 hdu 2923 Einbahnstrasse