zoukankan      html  css  js  c++  java
  • HDU1233 还是畅通工程【最小生成树】

    题意:

    求出连接各个村庄最小的公路总长度,把最小公路总长度求出来。

    思路:

    最小生成树原理,带入数据求得。

    代码:

    prim:

    #include<iostream>
    #include<cstring>
    
    using namespace std;
    #define inf 0x3f3f3f3f
    
    int main()
    {
        int n, i,j,b,c,d,min,a[105][105],visit[105],low[105];
        while(cin>>n,n)
        {
            memset(visit,0,sizeof(visit));
            int temp=n*(n-1)/2;
            while(temp--)
            {
                cin>>b>>c>>d;
                a[b][c]=a[c][b]=d;
            }
            visit[1]=1;int pos=1;  //第一次给low赋值
            for(i=1;i<=n;++i)
            {
                if(i!=pos) low[i]=a[pos][i];
            }
            int result=0; //运行m-1次,因为至少需要m-1次才能把所有的城市连通
            for(i=1;i<n;++i)
            {
                min=inf;
                for(j=1;j<=n;++j)
                {
                    if(!visit[j]&&min>low[j])
                    {
                        min=low[j];
                        pos=j;
                    }
                }
                result+=min;
                visit[pos]=1;
                for(j=1;j<=n;++j)
                {
                    if(!visit[j]&&low[j]>a[pos][j])
                    {
                        low[j]=a[pos][j];
                    }
                }
            }
            cout<<result<<endl;
        }
        return 0;
    }

    krusual:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    
    using namespace std;
    
    struct node
    {
        int u,v,w;
    };
    
    node arr[10000];
    int per[110],n;
    
    bool cmp(node a,node b)
    {
        return a.w<b.w;
    }
    
    void init()
    {
        for(int i=1;i<=n;++i)
        {
            per[i]=i;
        }
    }
    
    int find(int x)
    {
        if(x==per[x]) return x;
        return per[x]=find(per[x]);
    }
    
    bool join(int x,int y)
    {
        int fx=find(x);
        int fy=find(y);
        if(fx!=fy)
        {
            per[fx]=fy;
            return 1;
        }
        return 0;
    }
    
    int main()
    {
        int m;
        while(cin>>n,n)
        {
            init();
            m=n*(n-1)/2;
            for(int i=0;i<m;++i)
            {
                cin>>arr[i].u>>arr[i].v>>arr[i].w;
            }
            sort(arr,arr+m,cmp);
            int sum=0;
            for(int i=0;i<m;++i)
            {
                if(join(arr[i].u,arr[i].v))
                {
                    sum+=arr[i].w;
                }
            }
            cout<<sum<<endl;
        }
        return 0;
    }
  • 相关阅读:
    HLS协议实现
    hdu 1710 Binary Tree Traversals
    geoserver + postgis+postgresql+agslib.swc
    hdu 1241
    数值分析之牛顿法多项式求根
    逆波兰表达式 java
    【SQL】查询语句中in和exists的区别
    jsp连接MySQL操作GIS地图数据,实现添加point的功能
    mahout学习-1
    文件归档
  • 原文地址:https://www.cnblogs.com/darklights/p/7647874.html
Copyright © 2011-2022 走看看