zoukankan      html  css  js  c++  java
  • HDU 2988 || SDUT 2391 Dark roads(最小生成树kruskal算法)

    Dark roads

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 153    Accepted Submission(s): 74

    Problem Description

    Economic times these days are tough, even in Byteland. To reduce the operating costs, the government of Byteland has decided to optimize the road lighting. Till now every road was illuminated all night long, which costs 1 Bytelandian Dollar per meter and day. To save money, they decided to no longer illuminate every road, but to switch off the road lighting of some streets. To make sure that the inhabitants of Byteland still feel safe, they want to optimize the lighting in such a way, that after darkening some streets at night, there will still be at least one illuminated path from every junction in Byteland to every other junction. 

    What is the maximum daily amount of money the government of Byteland can save, without making their inhabitants feel unsafe? 

    Input

    The input file contains several test cases. Each test case starts with two numbers m and n, the number of junctions in Byteland and the number of roads in Byteland, respectively. Input is terminated by m=n=0. Otherwise, 1 ≤ m ≤ 200000 and m-1 ≤ n ≤ 200000. Then follow n integer triples x, y, z specifying that there will be a bidirectional road between x and y with length z meters (0 ≤ x, y < m and x ≠ y). The graph specified by each test case is connected. The total length of all roads in each test case is less than 231.

     

    Output

    For each test case print one line containing the maximum daily amount the government can save. 

     

    Sample Input

    7 11

    0 1 7

    0 3 5

    1 2 8

    1 3 9

    1 4 7

    2 4 5

    3 4 15

    3 5 6

    4 5 8

    4 6 9

    5 6 11

    0 0

     

    Sample Output

    51

     

    Source

    2009/2010 Ulm Local Contest

     

    Recommend

    lcy

     解题报告:这道题就是最小生成树的题的变形,就是先求出最小生成树,再用总路程减去最小生成树的总路程即可;今天的比赛做的这个题,当时想出怎么做了,悲哀的是最后没有时间了!这个题很变态,我一开始写出的代码是超时的,改变一点点就能AC,请大牛们指点;

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    const int N = 200010;
    int father[N], ans;
    int n, m;
    struct node
    {
    int x, y, v;
    }a[N];
    int cmp(const void *a, const void *b)//从小到大排序
    {
    return (*(struct node *)a).v - (*(struct node *)b).v;
    //若将上一行代码变成return (*(struct node *)a).v > (*(struct node *)b).v ? -1 :1;
    //就超时,哎,请大牛们指点这是为什么呢
    }
    void Makeset()//初始化
    {
    int i;
    for (i = 0; i <= n; ++i)
    {
    father[i] = i;
    }
    }
    int Find(int x)
    {
    if (father[x] != x)
    {
    father[x] = Find(father[x]);
    }
    return father[x];
    }
    int Merge(int x, int y, int p)
    {
    int i, j;
    i = Find(x);
    j = Find(y);
    if (i != j)
    {
    ans -= a[p].v;//从总的路程中减去最小的
    if (i > j)
    {
    father[i] = j;
    }
    else
    {
    father[j] = i;
    }
    return 1;
    }
    return 0;
    }
    int main()
    {
    int i;
    while (scanf("%d%d", &n, &m) != EOF && n && m)
    {
    memset(a, 0, sizeof(a));
    ans = 0;
    for (i = 0; i < m; ++i)
    {
    scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].v);
    ans += a[i].v;//先算出总的路程
    }
    Makeset();
    qsort(a, m, sizeof(a[0]), cmp);
    for (i = 0; i < m; ++i)
    {
    Merge(a[i].x, a[i].y, i);

    }
    printf("%d\n", ans);
    }
    return 0;
    }



  • 相关阅读:
    注解之------@WebService
    注解之----@component,@controller,@service ,@repository简介
    Java 之 I/O
    标签之----@Override
    注解之----@Resource
    弹指之间 -- 简谱
    弹指之间 -- Prerequisites
    MVC5 + EF6 完整入门教程三
    MVC5 + EF6 入门完整教程二
    MVC5 + EF6 入门完整教程
  • 原文地址:https://www.cnblogs.com/lidaojian/p/2368979.html
Copyright © 2011-2022 走看看