代码如下带有注释:

欢迎交流

#include<iostream>

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int select(int shortedge[],int n)
{
    int k,i,min1=9999;
    for(i=1;i<n;i++)
    if(shortedge[i]!=0&&shortedge[i]<min1) {min1=shortedge[i];k=i;}
    return k;
}
struct point
{
    int w;    //为图的弧长;
    int from,to;
    bool operator<(const point b) const
    {
        return this->w<b.w;
    }
};
class MGraph  //无向图;
{
public:
    int e,v;//边的数量,点的数量;
    int arc[100][100]; //邻接矩阵;
    point p[100];  //p为边集;
    MGraph(int x,int y);//x点,y边;
    void Kruskal();
    void Prim();
};
MGraph::MGraph(int x,int y)
{
    v=x;
    e=y;
    int i,j,k,t;
    for(i=0;i<x;i++)     //初始化全为9999;
        for(j=0;j<x;j++)
            arc[i][j]=9999;
    for(k=0;k<y;k++)
    {
        cin>>i>>j>>t;   //录入边的两个点和边的权值;
        p[k].from=i;
        p[k].to=j;
        p[k].w=t;
        arc[i][j]=t;
        arc[j][i]=t;
    }
}
void MGraph::Prim()
{
    int i,j,k,min1=0;
    int shortedge[100];
    for(i=0;i<v;i++)
    {
        shortedge[i]=arc[i][0];
    }
    shortedge[0]=0;   //将0点加入最小生成树;
    for(i=1;i<v;i++)  //还要加入v-1个点;
    {
        k=select(shortedge,v);
        min1+=shortedge[k];
        shortedge[k]=0;
        for(j=1;j<v;j++)
        {
            if(arc[j][k]<shortedge[j]) shortedge[j]=arc[j][k];
        }
    }
    cout<<min1<<endl;
}
int findroot(int parent[],int v)
{
    while(parent[v]!=-1)
    v=parent[v];
    return v;
}
void MGraph::Kruskal()
{
    int i;
    int x,y,num=0,min1=0;
    int parent[100];
    for(i=0;i<v;i++)    //初始化每个点都属于不同的联通分量;
        parent[i]=-1;
    sort(p,p+e);
    for(i=0;i<e;i++)
    {
        x=findroot(parent,p[i].from);
        y=findroot(parent,p[i].to);
        if(x!=y)    //下标为x,y的点不属于同一个联通分量;
        {
            min1+=p[i].w;
            parent[y]=x;
            num++;
            if(num==v-1) break;
        }
    }
    cout<<min1<<endl;
}
int main()
{
    int n,e;
    cin>>n>>e;
    MGraph M(n,e);
    cout<<endl;
    M.Prim();
    cout<<endl;
    M.Kruskal();
    return 0;

}

测试数据如下

4 6
0 1 4
0 2 9
0 3 21
1 3 17
1 2 8

2 3 16

运行截图:

C++求最小生成树Prim和Kruskal算法

相关文章:

  • 2021-04-22
  • 2021-08-11
  • 2021-11-30
  • 2022-12-23
  • 2021-11-18
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-21
相关资源
相似解决方案