题目1017:还是畅通工程

来源:互联网 发布:三维立体制作软件 编辑:程序博客网 时间:2024/06/06 02:07

可以很明显的看出,这是一道求最小生成树的问题,使用Kruskal算法和并查集的技巧,可以轻松解决。

#include <iostream>#include <math.h>#include <algorithm>using namespace std;struct Node{    int vil1;    int vil2;    int cost;};bool cmp (Node a,Node b){    return a.cost < b.cost;}int Tree[100];int findRoot(int x){    if (Tree[x] == -1) return x;    return findRoot(Tree[x]);}int main(){    int n;    while (cin >> n)    {        if (n == 0) break;        n = n*(n-1)/2;        int a,b;        Node ss[100];        int sum = 0;        for (int i = 1;i <= n;i++)        {            Tree[i] = -1;        }        for (int i = 0;i < n;i++)        {            cin >> ss[i].vil1 >> ss[i].vil2 >> ss[i].cost;        }        sort(ss,ss+n,cmp);        for (int i = 0;i < n;i++)        {            a = findRoot(ss[i].vil1);            b = findRoot(ss[i].vil2);            if (a != b)            {                Tree[a] = b;                sum += ss[i].cost;            }        }        cout << sum << endl;    }}


0 0
原创粉丝点击