zoukankan      html  css  js  c++  java
  • Poj1287--Networking(最小生成树)

    题目:http://poj.org/problem?id=1287

    题目不多说, 最小生成树模版题。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    struct NoThing
    {
        int from, to, val;
    } edge[10001];
    bool cMp(NoThing from, NoThing to)
    {
        return from.val < to.val;    
    } 
    int n, m, father[51];
    void init()
    {
        for(int i = 1; i <= n; i++)
            father[i] = i;
    }
    int Find(int a)
    {
        if(a == father[a])
            return a;
        else
            return father[a] = Find(father[a]); 
    }
    bool Mercy(int a, int b)
    {
        int Q = Find(a);
        int P = Find(b);
        if(Q != P)
        {
            father[Q] = P;
            return true;        
        }    
        return false;
    }
    int main()
    {
        while(~scanf("%d", &n), n)
        {
            init();
            scanf("%d", &m);
            for(int i = 0; i < m; i++)
                scanf("%d%d%d", &edge[i].from, &edge[i].to, &edge[i].val);
            sort(edge, edge+m, cMp);
            int sum = 0;
            for(int i = 0; i < m; i++)
                if(Mercy(edge[i].from, edge[i].to))
                    sum += edge[i].val;
            printf("%d
    ", sum); 
        }
        return 0;
    } 
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define M 51 
    using namespace std;
    const int INF = 0x3f3f3f3f;
    int n, m, vis[M], dis[M], map[M][M]; 
    void Prime()
    {
        int sum = 0;
        memset(vis, 0, sizeof(vis));
        for(int i = 1; i <= n; i++)
            dis[i] = map[1][i];
        vis[1] = 1;
        for(int i = 1; i < n; i++)
        {
            int temp = 1, min = INF;
            for(int j = 1; j <= n; j++)
            {
                if(!vis[j] && dis[j] < min)
                {
                    temp = j;
                    min = dis[j];    
                }    
            } 
            if(min == INF)
                return;
            vis[temp] = 1;
            sum += min;
            for(int j = 1; j <= n; j++)
                if(!vis[j] && dis[j] > map[temp][j])
                    dis[j] = map[temp][j];
        }
        printf("%d
    ", sum);
    } 
    int main()
    {
        while(~scanf("%d", &n), n)
        {
            scanf("%d", &m);
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= n; j++)
                {
                    if(i == j)
                        map[i][j] = 0;
                    else
                        map[i][j] = INF;
                }
            for(int i = 0; i < m; i++)
            {
                int a, b, c;
                scanf("%d%d%d", &a, &b, &c);
                if(map[a][b] > c)
                    map[a][b] = map[b][a] = c;
            }
            Prime();
        }
        return 0;
    }
  • 相关阅读:
    我们用的信息系统安全吗?
    硬件代理服务器的日志分析方法
    Solarwinds Orion NPM实战视频演示
    网络资源管理系统LANsurveyor实战体验
    2013年,我的推荐博客汇总
    如何精准高效的实现视觉稿?------前端开发辅助工具AlloyDesigner使用介绍
    SVG如何做圆形图片
    canvas绘制一定数目的圆(均分)
    如何禁止火狐onblur时alert()产生类似选中的拖蓝效果
    ABCD多选正则表达式
  • 原文地址:https://www.cnblogs.com/soTired/p/4837793.html
Copyright © 2011-2022 走看看