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;
}



原文地址:https://www.cnblogs.com/lidaojian/p/2368979.html