最小生成树

来源:互联网 发布:分水岭算法 过分割 编辑:程序博客网 时间:2024/06/07 16:30

最小生成树有很多种做法,大家应该都知道。
今天笔者专门为大家介绍两种做法:
代码比较丑,很久以前写的,不要见怪,在此博主致以强烈的抱歉。

方法一:邻接矩阵读入,prim算法处理

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;int main(){       int n,map[101][101],d[101],ans=0;    bool f[101];    scanf("%d",&n);    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            scanf("%d",&map[i][j]);    for(int i=2;i<=n;i++)        d[i]=1000000000;    memset(f,false,sizeof(f));    d[1]=0;    for(int i=1;i<=n;i++){        int min=2147483647,x;        for(int j=1;j<=n;j++)            if(!f[j] && d[j]<min){                min=d[j];                x=j;            }        ans+=min;        f[x]=true;        for(int j=1;j<=n;j++)            if(!f[j] && map[x][j]<d[j])               d[j]=map[x][j];    }    printf("%d\n",ans);    return 0;}

方法二:邻接表读入,kruskal处理

#include<iostream>using namespace std;struct node{    int x,y,w;};struct node a[1000];int f[1000];int cha(int x){    while(f[x]!=x)        x=f[x];     return x;}int main(){    int i,j,k,m,n;          cin>>n>>m;    for(i=1;i<=m;i++)        cin>>a[i].x>>a[i].y>>a[i].w;            for(i=1;i<m;i++)        for(j=i+1;j<=m;j++)            if(a[i].w>a[j].w){                struct node tmp=a[i];                a[i]=a[j];                a[j]=tmp;            }    for(i=1;i<=n;i++)f[i]=i;    int ans=0,s=0;    for(i=1;i<=m;i++)        if(cha(a[i].x)!=cha(a[i].y)){            f[cha(a[i].x)]=cha(a[i].y);            s++;            ans+=a[i].w;            if(s>=n-1)break;        }    cout<<ans<<endl;        return 0;}
0 0
原创粉丝点击