算法原理参考链接 ==> UESTC算法讲堂——最小生成树

关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/53132681

故稀疏图用 Kruskal、稠密图用 Prime、空间足够情况下都用 Prime + Heap 优化

下面的模板都是解决这一道题的模板

Prime模板

邻接矩阵版

#include<bits/stdc++.h>
using namespace std;
const int INF  = 0x3f3f3f3f;
;
int G[maxn][maxn], Dis[maxn], N;
bool vis[maxn];

int Prime(int st)
{
    ;
    ; i<=N; i++)
        vis[i] = false,
        Dis[i] = G[st][i];
    vis[st] = true;

    ; i<N; i++){
        int v, Min = INF;
        ; j<=N; j++){
            if(!vis[j] && Dis[j]<Min){
                Min = Dis[j];
                v = j;
            }
        }

        Cost += Dis[v];
        vis[v] = ;

        ; j<=N; j++){
            if(!vis[j] && Dis[j] > G[v][j]){
                Dis[j] = G[v][j];
            }
        }
    }

    return Cost;
}

int main(void)
{
    while(~scanf("%d", &N)){

        ; i<=N; i++)
            ; j<=N; j++)
                scanf("%d", &G[i][j]);

        printf());
    }
    ;
}

邻接表 + 堆优化

#include<bits/stdc++.h>
using namespace std;
;
struct EDGE{ int v, nxt, w; };
struct NODE{ int v, cost;
    NODE(int vv, int cc):v(vv), cost(cc){};
    bool operator < (const NODE &rhs)const{
        return this->cost > rhs.cost;
    };
};

EDGE Edge[maxn*maxn];
bool vis[maxn];
int Head[maxn];
int N, cnt;

inline void init()
{
    ; i<=N; i++)
        Head[i]=-,vis[i]=false;
    cnt = ;
}

inline void AddEdge(int from, int to, int weight)
{
    Edge[cnt].v = to;
    Edge[cnt].w = weight;
    Edge[cnt].nxt = Head[from];
    Head[from] = cnt++;
}

int Prime(int st)
{
    ;
    NODE tp(st, );
    priority_queue<NODE> que;
    que.push(tp);
    ;
    while(!que.empty() && EdgeCnt<cnt){
        tp = que.top(); que.pop();
        if(vis[tp.v]) continue;
        else vis[tp.v] = true;
        Cost += tp.cost;
        EdgeCnt++;
        ; j=Edge[j].nxt){
            if(!vis[Edge[j].v])
                que.push(NODE(Edge[j].v, Edge[j].w));
        }
    }
    return Cost;
}

int main(void)
{
    while(~scanf("%d", &N)){
        init();
        int Val;
        ; i<=N; i++){
            ; j<=N; j++){
                scanf("%d", &Val);
                if(Val){
                    AddEdge(i, j, Val);
                }
            }
        }
        printf());
    }
    ;
}

邻接表 + 配对堆优化

#include<bits/stdc++.h>
#include<ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
using namespace std;
;
struct EDGE{ int v, nxt, w; };
typedef pair<int, int> pii;

EDGE Edge[maxn*maxn];
bool vis[maxn];
int Head[maxn];
int N, cnt;

inline void init()
{
    ; i<=N; i++)
        Head[i]=-,vis[i]=false;
    cnt = ;
}

inline void AddEdge(int from, int to, int weight)
{
    Edge[cnt].v = to;
    Edge[cnt].w = weight;
    Edge[cnt].nxt = Head[from];
    Head[from] = cnt++;
}

int Prime(int st)
{
    ;
    __gnu_pbds::priority_queue< pii, greater<pii>, pairing_heap_tag > que;
    que.push(make_pair(, st));
    ;
    while(!que.empty() && EdgeCnt<cnt){
        pii tp = que.top(); que.pop();
        int v = tp.second;
        if(vis[v]) continue;
        else vis[v] = true;
        Cost += tp.first;
        EdgeCnt++;
        ; j=Edge[j].nxt){
            if(!vis[Edge[j].v])
                que.push(make_pair(Edge[j].w, Edge[j].v));
        }
    }
    return Cost;
}

int main(void)
{
    while(~scanf("%d", &N)){
        init();
        int Val;
        ; i<=N; i++){
            ; j<=N; j++){
                scanf("%d", &Val);
                if(Val){
                    AddEdge(i, j, Val);
                }
            }
        }
        printf());
    }
    ;
}

Kruskal模板

#include<bits/stdc++.h>
using namespace std;

;//最大点数
int c[maxn], N;//并查集使用
int cnt;

struct EDGE{
    int from, to, w;
    bool operator < (const EDGE &rhs) const{
        return this->w < rhs.w;
    };
}Edge[maxn*maxn];//储存边的信息,包括起点/终点/权值

inline void init()
{
    ; i<=N; i++)
        c[i] = i;
    cnt = ;
}

inline void AddEdge(int from, int to, int weight)
{
    Edge[cnt].from = from;
    Edge[cnt].to   = to;
    Edge[cnt].w    = weight;
    cnt++;
}

int Findset(int x)
{
    int root = x;
    while(c[root] != root)
        root = c[root];

    int idx;
    while(c[x] != root){ /// 路径压缩
        idx = c[x];
        c[x] = root;
        x = idx;
    }
    return root;
}

int Kruskal()//传入点数,返回最小生成树的权值,如果不连通返回-1
{
    sort(Edge,Edge+cnt);
    ;//计算加入的边数
    ;

    ;i<cnt;i++){
        int R1 = Findset(Edge[i].from);
        int R2 = Findset(Edge[i].to);
        if(R1 != R2){
            Cost += Edge[i].w;
            c[R1]=R2;
            EdgeCnt++;
        }
        ) break;
    }
    ) ;//不连通
    else return Cost;
}

int main()
{
    while(~scanf("%d", &N)){
        init();
        int Val;
        ; i<=N; i++){
            ; j<=N; j++){
                scanf("%d", &Val);
                if(Val){
                    AddEdge(i, j, Val);
                }
            }
        }
        printf("%d\n", Kruskal());
    }
    ;
}

Prime算法 与 Kruskal算法求最小生成树模板的更多相关文章

  1. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

  2. 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析

    最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...

  3. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  4. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  5. 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)

    普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...

  6. Prim算法、Kruskal算法、Dijkstra算法

    无向加权图 1.生成树(minimum spanning trees) 图的生成树是它一棵含有所有顶点的无环联通子图 最小生成树:生成树中权值和最小的(所有边的权值之和) Prim算法.Kruskal ...

  7. 最小生成树两个经典算法(Prime算法、Kruskal算法) - biaobiao88

    经典的最小生成树例子,Prime算法,具体的步骤及其注释本人均在代码中附加,请仔细阅读与品味,要求,可以熟练的打出. //Prime算法基础 #include<iostream> usin ...

  8. 最小生成树-Prim算法与Kruskal算法

    一.最小生成树(MST) ①.生成树的代价:设G=(V,E)是一个无向连通网,生成树上各边的权值之和称为该生成树的代价. ②.最小生成树:在图G所有生成树中,代价最小的生成树称为最小生成树. 最小生成 ...

  9. (学习1)最小生成树-Prim算法与Kruskal算法

    最小生成树: 求一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 1:Prim算法(适合稠密图) 伪代码: Prim(G){ //G ...

  10. 最小生成树的Prim算法以及Kruskal算法的证明

    Prime算法的思路:从任何一个顶点开始,将这个顶点作为最小生成树的子树,通过逐步为该子树添加边直到所有的顶点都在树中为止.其中添加边的策略是每次选择外界到该子树的最短的边添加到树中(前提是无回路). ...

随机推荐

  1. Eclipse java web项目 ,导入IntelliJ IDEA 完整操作!

    1.如图,这是一个ec项目,是一个ssh框架,搭建一个后台, 我们在idea 新建一个项目:new - project from Existing sources... 要是不放心,你可以做一个文件备 ...

  2. oracle 11g 数据库恢复技术 ---03 补充日志

    三 补充日志(supplemental logging) 补充日志是对重做记录中变更矢量的补充信息,增加了变更矢量记载的记录量.Oracle某些功能要求启用补充日志才能正常或更好的工作,比如logmi ...

  3. JPA 学习笔记

    eclipse 新建jpa项目 : 修改 persistence.xml 文件 创建 Customer 类:    column 名称和数据库名称对应则不用写 类写好后在 persistence.xm ...

  4. AngularJs——基础小知识(二)

    AngularJs的过滤器 1.Currency :过滤器(金额货币格式化)       

  5. Python3数据分析与挖掘建模实战 学习 教程

    Python3数据分析与挖掘建模实战 学习 教程 Python数据分析简介Python入门 运行:cmd下"python hello.py" 基本命令: 第三方库安装Windows ...

  6. C#Exception 追踪异常位置

    1:在编写软件时,保护关键位置的代码正常运行,要对这位置进行异常处理try catch private void StartTCPServer() { try { ........//我们要确保知道这 ...

  7. 饿了吗开源组件库Element模拟购物车系统

    传统的用html+jquery来实现购物车系统要非常的复杂,但是购物车系统完全是一个数据驱动的系统,因此采用诸如Vue.js.angular.js这些框架要简单的多.饿了吗开源的组件库Element是 ...

  8. EOJ Monthly 2019.2 A. 回收卫星

    题目传送门 题意: 你可以询问一个三维坐标,机器会告诉你这个坐标在不在目标圆中, 并且(0,0,0)是一定在圆上的,叫你求出圆心坐标 思路: 因为(0,0,0)一定在圆上,所以我们可以把圆心分成3个坐 ...

  9. 3183 RMQ / 贪心(坑成。。)

    题意:删去m个数,使剩下的数组成的数最小 题解 :贪心 , RMQ RMQ解法,建st表找,用rmq找最小值的下标,注意点 ,因为最小值是区间最右最小值,所以应该改成 <= 而不是< mi ...

  10. C# <T>泛型的使用

    在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制称为约束.约束是使用 where 上 ...