最小生成树

1.Prim

#include<iostream>
#include<cstring>
#define MAXN 1000
#define INF 0xfffffff
using namespace std;
int n,m,s,e,val;
int sum=0;
void prim();
int w[MAXN][MAXN];
int mst[MAXN];
int lowcost[MAXN];
int main()
{
    memset(w,0x7f,sizeof(w));
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>s>>e>>val;
        w[s][e]=val;
        w[e][s]=val;
    }
    prim();
    cout<<sum<<endl;
    return 0;
}
void prim()
{
    for(int i=2;i<=n;i++)
    {
        lowcost[i]=w[1][i];
        mst[i]=1;
    }
    mst[1]=0;
    for(int i=2;i<=n;i++)
    {
        int min=0x7f;
        int minid=0;
        for(int j=2;j<=n;j++)
        {
            if(lowcost[j]<min&&lowcost[j]!=0)
            {
                min=lowcost[j];
                minid=j;
            }
        }
    //    cout<<"V"<<mst[minid]<<"-V"<<minid<<"="<<min<<endl;
        sum+=min;
        lowcost[minid]=0;
        for(int j=2;j<=n;j++)
        {
            if(w[minid][j]<lowcost[j])
            {
                lowcost[j]=w[minid][j];
                mst[j]=minid;
            }
        }
    }
}

2.Kruskal

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt=0,f[6000];
long long ans=0;
struct p
{
    int start;
    int end;
    int val;
}line[200011];
int find(int x)
{
    if(f[x]!=x) f[x]=find(f[x]);
    return f[x];
}
bool judge(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y) return true;
    else return false;
}
void merge(int x,int y)
{
    x=find(x);
    y=find(y);
    f[x]=y;
}
bool cmp(p n1,p n2)
{
    return n1.val<n2.val;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++)
        cin>>line[i].start>>line[i].end>>line[i].val;
    sort(line+1,line+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int u=find(line[i].start);
        int v=find(line[i].end);
        if(judge(u,v)) continue;
        merge(u,v);
        cnt++;
        ans+=line[i].val;
        if(cnt==n-1) break;
    }
    if(cnt==n-1) cout<<ans<<endl;
    else cout<<"orz"<<endl;
    return 0;
}
//两者区别:Prim在稠密图中比Kruskal优,在稀疏图中比Kruskal劣。Prim是以更新过的节点的连边找最小值,Kruskal是直接将边排序。
//两者其实都是运用贪心的思路
posted @ 2022-04-15 20:32  Bronya_Silverwing  阅读(44)  评论(0)    收藏  举报