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;
    }
  • 相关阅读:
    【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(前言)
    【CityHunter】游戏流程设计及技术要点
    lua table操作
    python线程池(转)
    windows通过企业内部授权服务器激活方法
    贝叶斯定理(转)
    python 日期计算
    python 过滤 b'及提取 cmd命令返回值
    python 连接MySQL数据库
    python 获取昨天的日期
  • 原文地址:https://www.cnblogs.com/darklights/p/7647874.html
Copyright © 2011-2022 走看看