最小生成树-prim算法

来源:互联网 发布:欧姆龙传感器淘宝 编辑:程序博客网 时间:2024/06/16 14:08

最小生成树( MIT )的经典解决方法有2种:prim算法和kruskal算法,其中prim算法 从一个任意根节点开始,一直长大覆盖到整棵树。

算法需要3个数组来实现:
arr[i][j]:存放点到点之间的权值,初始值为最大值,若 是该两点之间有边则改变权值
a[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说明以i为终点的边的最小权值=0,也就是表示i点加入了MST
s[i]:表示对应lowcost[i]的起点,即说明边< mst[i],i>是MST的一条边,当mst[i]=0表示起点i加入MST

//实现找到图中的最小生成树并将其权值和返回#include<iostream>#include<cstring>using namespace std;const int maxn=10000;int arr[maxn][maxn];//存放点点间权值 int prims(int arr[][maxn],int n){    int a[maxn];     int s[maxn];     int i,j,min,minid,sum=0;    for(i=2;i<=n;i++)    {        a[i]=arr[1][i];        s[i]=1;    }    s[1]=0;    for(i=2;i<=n;i++)    {        min=maxn;        minid=0;        for(j=2;j<=n;j++)        {            if(a[j]<min&&a[j])            {                min=a[j];                minid=j;            }        }        cout<<"v"<<s[minid]<<"v"<<minid<<"="<<min<<endl;        a[minid]=0;        sum+=min;        for(j=2;j<=n;j++)        {            if(arr[minid][j]<a[j])            {                a[j]=arr[minid][j];                s[j]=minid;            }        }    }    return sum;}int main(){    int i,j,n,m,k,c;    cin>>n>>m;//n:顶点数 m:边数     for(i=1;i<=n;i++)        for(j=1;j<=n;j++)            arr[i][j]=maxn;    for(k=1;k<=m;k++)    {        cin>>i>>j>>c;        arr[i][j]=c;        arr[j][i]=c;    }    c=prims(arr,n);     cout<<c<<" ";       return 0;}
原创粉丝点击