kruskal与prim最小生成树算法
2018-01-13 23:43
459 查看
以下代码未经验证:
prim算法代码如下,未经验证:
vector<BORDER> borders;
void prim()
{
bool isVisited[vertexNum] = {0};
int curVertex = 0, curNextVertex = 0;
isVisited[curVertex] = true;
int minBorder = MAXINT;
BORDER temp;
int vistedBCount = 0;
while( vistedBCount < vertexNum - 1)
{
for (int i = 1; i < vertexNum; i++)
{
if (curVertex != i && G.border[curVertex][i] < minBorder && isVisited[i] == false)
{
minBorder = G.border[curVertex][i];
curNextVertex = i;
}
}
temp.v1 = curVertex;
temp.v2 = curNextVertex;
temp.weight = minBorder;
borders.push_back(temp);
curVertex = curNextVertex;
vistedBCount++;
}
}
#include<vector> #include<algorithm> using namespace std; #define MAXINT 0xffff #define vertexNum 10 typedef struct Graph { int border[vertexNum][vertexNum]; }Graph; typedef struct border { int v1; //第一个顶点 int v2; //第二个顶点 int weight; //权重 }BORDER; //边结构 Graph G; bool cmp(BORDER a, BORDER b) //作为排序回调函数,按权重对结构体从小到大排序 { return a.weight < b.weight; } vector<BORDER> minTree; void Kruskal() { vector<BORDER> b; BORDER temp; for(int i = 0; i < vertexNum - 1; i++) //列出所有边并存储进边结构 { for(int j = i + 1; j < vertexNum; j++) { if(G.border[i][j] < MAXINT) { temp = { i, j, G.border[i][j] }; b.push_back(temp); } } } sort(b.begin(), b.end(), cmp); //对所有边按权重由小到大排序 int bSet[vertexNum] = { 0 }; //初始时每个顶点都为独立的树,对应集合不同 for(int i = 0; i < vertexNum; i++) { bSet[i] = i; //bSet[]所有i对应的值不相同,索性就都等于i,下标肯定不同,所以值不同。后续把i1,i2值设为相同的话,则意味着,i1,i2在同一个集合(树) } int size = b.size; for(int i = 0; i < size; i++) { if(bSet[b[i].v1] != bSet[b[i].v2]) //如果该边的两个顶点不在同一个集合(树) { minTree.push_back(b[i]); //把该边存到结果集 for(int j = 0; j < vertexNum; j++) { if(bSet[j] == bSet[b[i].v1]) //找出b[i].v1所在集合的所有点 { bSet[j] = bSet[b[i].v2]; //把b[i].v1这个点所在集合的所有的点都放到bSet[i].v2所在集合,其实就是合并这个两个点所在集合 } } } } }
prim算法代码如下,未经验证:
vector<BORDER> borders;
void prim()
{
bool isVisited[vertexNum] = {0};
int curVertex = 0, curNextVertex = 0;
isVisited[curVertex] = true;
int minBorder = MAXINT;
BORDER temp;
int vistedBCount = 0;
while( vistedBCount < vertexNum - 1)
{
for (int i = 1; i < vertexNum; i++)
{
if (curVertex != i && G.border[curVertex][i] < minBorder && isVisited[i] == false)
{
minBorder = G.border[curVertex][i];
curNextVertex = i;
}
}
temp.v1 = curVertex;
temp.v2 = curNextVertex;
temp.weight = minBorder;
borders.push_back(temp);
curVertex = curNextVertex;
vistedBCount++;
}
}
相关文章推荐
- 最小生成树算法(prim&kruskal)
- 最小生成树算法:prim和kruskal
- 算法记录---最小生成树【kruskal&&prim】
- 图的广度遍历、深度遍历及最小生成树书算法(Prim、Kruskal)
- 最小生成树两种算法。kruskal和prim
- 算法整理:最小生成树(mst)-Prim+Kruskal
- 关于图的常用算法——Dijkstra单源最短路径、Floyd多源最短路径、Prim和Kruskal最小生成树算法
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- hdu 1863 畅通工程 最小生成树模板入门题 prim+kruskal两种算法AC。
- 最小生成树 prim 算法 与kruskal 算法
- 最小生成树 Prim(普里姆)算法和Kruskal(克鲁斯特尔)算法
- 【算法复习】图的最小生成树(Prim&Kruskal)
- 最小生成树算法(Prim和Kruskal)
- 最小生成树 ,prim 和Kruskal 算法
- 最小生成树算法介绍(转载)Prim+Kruskal
- 最小生成树之克鲁斯卡尔(Kruskal)算法、普里姆(prim)算法
- hdu 1162 Eddy's picture 最小生成树入门题 Prim+Kruskal两种算法AC
- 最小生成树算法Prim、Kruskal
- 最小生成树算法(Prim+Kruskal)
- 数据结构之最小生成树的Prim和Kruskal`s 算法