图--最小生成树(数据结构)

来源:互联网 发布:淘宝首页服务 编辑:程序博客网 时间:2024/06/05 00:17
  • 不同城市之间修路的最小费用,即在图中找权值之和最小的极小连通子网(在连通网中找一颗生成树,最小生成树)。

  • Kruslal求最小生成树:
    1)思路:图中所有的点自己为一个连通分量,然后从所有的边中选取一个权值最小的边,若该边对应的点在不同的连通分量里,则将点合并到同一个连通分量里,以此类推,直至所有的点都在一个连通分量里。
    2)代码实现(多利用并查集算法):

//并查集模板int parent[1000];//父节点数组//图中有n个点void Init(int n){    for(int i = 0;i < n; ++i)    {        //初始化,每个点的父亲节点都是它自身        parent[i] = i;    }}//查询某个点的父节点int Find(int n){    if(n == parent[n])        return n;    else    {        int y = Find(parent(n));        parent[n] = y;        return y;    }}//合并两个连通分量到一个连通分量里void Union(int a,int b){    int aa = Find(a);    int bb = Find(b);    if(aa == bb)        return ;    else    {        //靠左原则        parent[b] = aa;//把b的父节点设置为aa    }}
  • Prim算法求最小生成树
    1)思路:设U为已并入最小生成树中的顶点集合,最初任选一点放入U,之后找到U到V-U中的最小边,将对应新顶点并入,共N-1轮即可。从顶点U0开始,令U={U0},初始化U0到各顶点的距离,{找最小边输出,并入新顶点,赋0更新表使U到U-V距离更小},重复n-1次。
    2)代码实现:
#define MAXINT 0x3f3f3f3fint map[n][n],low[n],visited[n];//map数组存点和点之间的距离,low数组存每两个点之间的最小距离,visited数组标记某个点是否被访问int prim(){    int i,j,pos,min,result = 0;    memset(visited,0,sizeof(visited));    pos = 1;//pos是当前选的某个点,最开始选第一个点    //给low数组赋值    for(i = 1;i <= n; ++i)    {        if(pos != i)           low[i] = map[pos][i];        else            low[i] = 0;    }    visited[1] = 1;    //假设从第一个点开始    for(i = 1; i < n; ++i)    {        min = MAXINT;        //未访问过的点里,找到最小权值并记录位置        if(visited[i] == 0 && min > low[i])        {            min = low[i];            pos = i;        }        //最小权值累加        result += min;        //标记该点        visited[pos] = 1;        //更新权值        for(j = 1;j <= n; ++j)        {            if(j != pos)                low[j] = map[pos][j];            else                low[j] = 0;        }    }}

(数据结构PPT上的代码看不太明白,从网上找的代码,勉强能懂,还要再看)。

原创粉丝点击