【c++】Prim算法和Kruskal算法完整代码

最小生成树的两种方法。

Prim算法:

#include 
#define INF 99999
using namespace std;

const int N=6;
bool visit[N];
int dist[N]={0};
int graph[N][N]={{},
                 {}   //省略输入
                 };

int prim(int cur){
    int index=cur;
    int sum=0;
    cout<<index<<" ";
    memset(visit,false,sizeof(visit));
    visit[cur]=true;
    for(int i=0;i<N;i++)
        dist[i]=graph[cur][i];
    for(int i=1;i<N;i++){
        int min=INF;
        for(int j=0;j<N;j++){
            if(!visit[j]&&dist[j]<min){
                min=dist[j];
                index=j;
            }
        }
        visit[index]=true;
        cout<<index<<" ";
        sum+=min;
        for(int j=0;j<N;j++){
            if(!visit[j]&&dist[j]>graph[index][j])   //执行更新,如果点距离当前点的距离更近,就更新dist
                dist[j]=graph[index][j];
        }
    }
    cout<<endl;
    return sum;
}

int main(){
    cout<<prim(0)<<endl;    //从顶点0开始
}

Kruskal算法:

#include 
#include 
#define N 7
using namespace std;

typedef struct _node{
    int val;
    int start;
    int end;
}Node;

Node V[N];

int cmp(const void *a, const void *b){
    return (*(Node *)a).val-(*(Node*)b).val;
}

int edge[N][N]={};   //省略
int father[N]={0};
int cap[N]={0};

void make_set(){    //初始化集合,让所有的点都各成一个集合,每个集合都只包含自己
    for(int i=0;i<N;i++){
        father[i]=i;
        cap[i]=1;
    }
}

int find_set(int x){    //判断一个点属于哪个集合,点如果都有着共同的祖先结点,就可以说它们属于一个集合
    if(x!=father[x]) father[x]=find_set(father[x]);
    return father[x];
}

void Union(int x,int y){   //将x,y合并到同一个集合
    x=find_set(x);
    y=find_set(y);
    if(x==y) return;
    if(cap[x]<cap[y]) father[x]=find_set(y);
    else{
        if(cap[x]==cap[y]) cap[x]++;
        father[y]=find_set(x);
    }
}

int Kruskal(int n){
    int sum=0;
    make_set();
    for(int i=0;i<N;i++){  //边的顺序按从小到大取出来
        if(find_set(V[i].start)!=find_set(V[i].end)){   //若不在一个集合里面
            Union(V[i].start,V[i].end);  //合并两个顶点
            sum+=V[i].val;
        }
    }
    return sum;
}

int main(){
    for(int i=0;i<N;i++){   //初始化边的数据
        V[i].start=edge[i][0];
        V[i].end=edge[i][N];
        V[i].val=edge[i][……];
    }
    qsort(V,N,sizeof(V[0]),cmp);
    cout<<Kruskal(0)<<endl;
    return 0;
}


你可能感兴趣的:(数据结构与算法)