zoukankan      html  css  js  c++  java
  • 最小生成树(两种方法)

    嗯,最近时间有点紧

    以后有空再配解析

    题目是这道→  洛谷【模板】最小生成树

    代码来了

    Prim

    ↓↓↓

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,i,j,k,x,y,z;
    int a[5050][5050];
    bool u[5050];
    int f[5050];
    int main()
    {
        cin>>n>>m;
        memset(f,0x7f,sizeof(f));
        memset(a,0x7f,sizeof(a));
        for(i=1;i<=m;i++)
        {
            cin>>x>>y>>z;
            a[x][y]=min(z,a[x][y]);
            a[y][x]=min(z,a[y][x]);
        }
        f[1]=0;
        for(i=2;i<=n;i++)
        {
            int minn=1e9,k;
            for(j=1;j<=n;j++)
            {
                if(!u[j]&&f[j]<minn)
                {
                    minn=f[j];
                    k=j;
                }
            }
            if(minn==1e9)
            {
                cout<<"orz";
                return 0;
            } 
            u[k]=true;
            for(j=1;j<=n;j++)
            if(!u[j])
                f[j]=min(f[j],a[k][j]);
                
        }
        int ans=0;
        for(i=1;i<=n;i++)
        ans+=f[i];
        cout<<ans;
        return 0;    
    } 
     

    Kruskal

    (个人喜欢这个)

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,i,j,k,x,y,z;
    int f[5050],ans;
    
    struct tree{
        int x,y,z;
    }a[200050];
    
    bool cmp(tree a,tree b)
    {
        return a.z<b.z;
    }
    
    int find(int x)//路径压缩版 
    {
        if(f[x]!=x) f[x]=find(f[x]);
        return f[x];  
    }
    
    void unionn(int x,int y)
    {
        int r1=find(x);
        int r2=find(y);
        f[r1]=r2;
    }
    
    int main()
    {
        cin>>n>>m;
        for(i=1;i<=n;i++)
        f[i]=i;
        for(i=1;i<=m;i++)
        {
            cin>>x>>y>>z;
            a[i].x=x;
            a[i].y=y;
            a[i].z=z;
        }
        sort(a+1,a+1+m,cmp);
        k=0;
        for(i=1;i<=m;i++)
        {
            if(find(a[i].x)!=find(a[i].y))
            {
                unionn(a[i].x,a[i].y);
                ans+=a[i].z;
                k++;
            }
            if(k==n-1) break; 
        }
        if(k!=n-1)
        {
            cout<<"orz";
            return 0;
        }
        cout<<ans;
        return 0;
    } 
     
  • 相关阅读:
    断棍构造过程-波利亚翁方案-中餐馆过程
    狄利克雷过程
    狄利克雷分布
    共轭先验(conjugate prior)
    镜像与文件系统
    Oracle-04
    Oracle-02
    Oracle-01
    认识数据库
    c:forEach的作用
  • 原文地址:https://www.cnblogs.com/zhouzhihao/p/10547476.html
Copyright © 2011-2022 走看看