zoukankan      html  css  js  c++  java
  • 最小生成树模板+并查集(隐藏)+结构体排序模板

    minn[101],g[101][101],u[101];
     
    memset(u,1,sizeof(u));
    memset(minn,0x7f,sizeof(minn));
     
     minn[1]=0;
     u[1]=0;
     i,j,k,m;
     total=0;
    for(i=1;i<=n;i++)
    {
        k=0;
        for(j=1;j<=n;j++)
        if(u[j]&&(minn[k]>minn[j]))
        k=j;
        u[k]=0;
        for(j=1;j<=n;j++)
        if(u[j]&&(g[k][j]<minn[j]))
        minn[j]=g[k][j];
    } 
    for(i=1;i<=n;i++)
    total+=minn[i];
    cout<<total<<endl;
    
    /*prim*/
    
    struct edge
    {
        int x,y,v;
    }a[1001];
    int f[1001];
    int find(int x)
    {
        if(find(x)==x)return x;
        f[x]=find(x);
        return f[x];
    }
    unionn(int x,int y)
    {
        int fa=find(x);
        int fb=find(y);
        if(fa!=fb)
        f[fa]=fb;
    }
    int cmp(const edge &a,const edge &b)
    {
        if(a.v <b.v) return 1;
        else return 0;
    }
    
    //输入:
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        cin>>fron>>to>>w;
        a[i].x=from;
        a[i].y=to;
        a[i].v=w;
    } 
    //或者别的什么方式 
    
    //排序
    sort(a,a+m+1);
     
     //核心代码 
    int sum=0,k=0;
    for(i=1;i<=m;i++)
    {
        int r1=find(a[i].x);
        int r2= find(a[i].y);
        if(r1!=r2)
        {
            sum+=a[i].v;
            k++;
            unionn(a[i].x,a[i].y);
        }
        if(k==n-1) break;
    }
    
    //输出
    cout<<sum; 
    
    /*Kruskal+并查集(隐)+结构体排序*/

    我爱我自己!!!

  • 相关阅读:
    P2045 方格取数加强版
    P2774 方格取数问题
    日记——OI历程
    6.30考试
    6.29考试
    数论...
    6.28数论测试
    洛谷P3802 小魔女帕琪
    hosts
    博客设置
  • 原文地址:https://www.cnblogs.com/ZDHYXZ/p/7142525.html
Copyright © 2011-2022 走看看