kruskal算法


Dijskla与prime都是基于点与点之间的距离,kruskal则是基于边权做的优化。

步骤:

  1. 对所有边权进行排序。
  2. 如果最小边的两个端点不在一个连通图中则将该边占领,否则则放弃。
  3. 结束条件:无可以插入边或者总顶点数达到要求。
为什么不能用int point[N]标记区分,然后取min的值替换?

因为替换只能改变一个块在的一个节点,要整个块一起修改域的标记需要用交并集fathers[]。

测试数据:
6 10
0 1 4
0 4 1
0 5 2
1 5 3
4 5 3
2 1 1
2 5 5
3 4 5
3 5 4
3 2 6

image.png

主要的数据结构:

struct edge{
  int from,to;
  int length;
  bool occupy;
  edge(){
    length=0;
    from=0;
    to=0;
    occupy=false;
  }
}
// 点数,边数
int points,edges;
// 并查集的fathers
int fathers[N];

示例代码:

#include 
using namespace std;
#define N 1000
struct edge{
  int from,to;
  int length;
  bool occupy;
  edge(){
    length=0;
    from=0;
    to=0;
    occupy=false;
  }
}E[N];
// 点数,边数
int points,edges;
// 并查集的fathers
int fathers[N];

// 把边根据权值进行排序
bool cmp(edge a,edge b){
  return a.length"<

你可能感兴趣的:(kruskal算法)