zoukankan      html  css  js  c++  java
  • SDUT 2144

     有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。

    Input

     输入包含多组数据,格式如下。

    第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)

    剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。

    Output

     每组输出占一行,仅输出最小花费。

    运行错误一次,数组大小应取决于边的数量。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #define Maxn 10010
    using namespace std;
    struct edge
    {
        int start,endn,weight;
    } edges[Maxn];
    char parent[Maxn];
    int n,m;
    int cmp(struct edge a,struct edge b)
    {
        return a.weight<b.weight;
    }
    int Find(int x)
    {
        int r,temp;
        for(r=x; parent[r]>=0; r=parent[r]);
        while(r!=x)
        {
            temp=x;
            x=parent[x];
            parent[temp]=r;
        }
        return r;
    }
    void merge(int A,int B)
    {
        int a=Find(A),b=Find(B);
        int temp=parent[a]+parent[b];
        if(parent[a]>parent[b])
        {
            parent[a]=b;
            parent[b]=temp;
        }
        else
        {
            parent[b]=a;
            parent[a]=temp;
        }
    
    }
    
    void kruskal()
    {
        int sumweight=0,d=0;
        for(int i=0; i<m;i++)
        {
            if(Find(edges[i].start)!=Find(edges[i].endn))
            {
                d++;
                sumweight+=edges[i].weight;
                merge(edges[i].start,edges[i].endn);
            }
        }
        if(d==n-1)
            printf("%d
    ",sumweight);
        else
            printf("ERROR
    ");
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(parent,-1,sizeof(parent));
            for(int i=0; i<m; i++)
                scanf("%d%d%d",&edges[i].start,&edges[i].endn,&edges[i].weight);
            sort(edges,edges+m,cmp);
            kruskal();
        }
        return 0;
    }
  • 相关阅读:
    单点登录原理与简单实现
    关系型数据库中的关键字、主关键字和候选关键字
    无向图的顶点连通度
    memcmp()直接比较两个数组的大小
    静态字典树
    动态字典树
    poj 1149
    poj 2112 floyd+Dinic最大流+二分最小值
    POJ 1698 (二分图的多重匹配)
    网络流算法
  • 原文地址:https://www.cnblogs.com/coder-tcm/p/9193271.html
Copyright © 2011-2022 走看看