Problem B Reading books

Problem B

Reading books

(Input File: book.in / Standard Output)

 

In the summer vacation, LRJ wants to improve himself in computer science. So he finds out N books of computer science in the school library. The books are numbered from 0 to N-1.

To finish reading the i-th book, it takes LRJ time[i] minutes. But some books are similar in the content. If the i-th book and the j-th book are similar, then if LRJ has finished reading the i-th book, it will take him only  minutes to finish reading the j-th book. Of course if LRJ has finished reading the j-th book, it will take him only  minutes to finish reading the i-th book. Now you are asked to tell LRJ the minimal total time to finish reading all the N books.

 

Input:

The first line contains two integers N (0<=N<=100) and M (0<=M<=N*(N-1)/2). N is the total number of books. M is the number of pairs which are similar.

Then the following N lines describe time[0], time[1], … , time[N-1] (1<=time[i]<=105).

Next comes M lines, each contains two integer (i, j), indicating that the i-th book and the j-th book are similar.Input is ended by N=0 and M=0.

 

 

Output:

For each test case, just output the minimal total time on a single line.

 

Sample input:

2 1

6

10

0 1

3 2

1

2

3

0 1

1 2

3 1

2

4

6

0 1

0 0

 

Sample output:

11

3

10

 

Hints:

For the first test case, if LRJ read the books in the order (0, 1), then the total time = 6+10/2=11; If in the order (1, 0), then the total time =10+ 6/2=13.


代码:

#include <stdio.h>
int father[105];
int time[105];
int find(int x)
{
	if (father[x] == x)
		return x;
	else
		return (father[x] = find(father[x]));
}
void merge(int a, int b)
{
	int x, y;
	x = find(a);
	y = find(b);
	if (time[x] > time[y])
		father[x] = y;
	else
		father[y] = x;
}
int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		if (0 == n && 0 == m)
			return 0;
		for (int i = 0; i < n; i++){
			father[i] = i;
			scanf("%d", &time[i]);
		}
		for (int i = 0; i < m; i++){
			int a, b;
			scanf("%d%d", &a, &b);
			merge(a, b);
		}
		int ans = 0;
		for (int i = 0; i < n; i++){
			if (father[i] == i)
				ans += time[i];
			else
				ans += time[i] / 2;
		}
		printf("%d\n", ans);
	}
	return 0;
}



   

你可能感兴趣的:(C++,ACM,并查集)