【贪心】畅通工程系列总结-kruskal vs Prim

两种算法kruskal&Prim

这两种算法都是求最小生成树的贪心算法,但是出发角度不一样。kruskal算法是从边出发,将边按权值从小到大排序,然后遍历选边;Prim算法是从顶点的角度出发,在V-U中找离U最近的顶点。这就决定了这两种算法的适用范围,kruskal适用于点多边少的情况,适用于稀疏图;Prim算法适用于边多点少的情况,适用于稠密图。

一点想法

刚开始是在集合论图论中学的两种算法,当时还觉得不好用程序实现,直到后来在算法课上讲,懂了之后确实有一种恍然大悟的感觉。通过对畅通工程系列的整理和总结,我发现对于算法的理解是非常非常重要的,一旦你明白了这个算法的原理,就会很容易明白它的实现过程,或者说很容易用程序把它实现。

kruskal&Prim板子题

HDU1863-kruskal

#include
#include
using namespace std;
const int maxn=105;

struct road
{
    int b;//起点
    int e;//终点
    int v;//成本
} a[maxn*maxn/2];

int root[maxn];
int n,m;//道路数,村庄数
int ans;//最低成本
int cnt;//要修建的道路数目

void init()
{
    for(int i=0; i>n>>m&&n)
    {
        int i;
        for(i=1; i<=n; ++i)
            cin>>a[i].b>>a[i].e>>a[i].v;
        kruskal();
        if(cnt==m-1)
            cout<

HDU1233-Prim

#include
#include
#include
using namespace std;
const int maxn=105;
const int INF=1<<29;

int n,m;//顶点数,边数
int closest[maxn];//V-U中离U最近的顶点
int lowcost[maxn];//V-U中顶点到U的最小边权值
int vis[maxn];//是否在U中
int map_[maxn][maxn];
int ans;//最低成本

void init()
{
    for(int i=1; i<=n; ++i)
    {
        closest[i]=1;
        lowcost[i]=map_[i][1];
    }
    memset(vis,0,sizeof(vis));
    ans=0;
    vis[1]=1;
    lowcost[1]=0;
}

void Prim()
{
    init();
    int i,j,k,min_num;
    for(i=1; i<=n; ++i)
    {
        min_num=INF;
        k=0;
        for(j=1; j<=n; ++j)//找到V-U中离U最近的顶点
            if(!vis[j]&&lowcost[j]

你可能感兴趣的:(算法,贪心,kruskal,Prim,图论)