常言道:团结就是力量。这里我们定义一个群体是“团结”的,如果这个群体中的任意两个人都是好朋友。并且,我们假定友谊是双向且可传递的,即:若 A 和 B 是朋友、B 和 C 是朋友,则 A 和 C 一定是朋友。下面给定一些人与人之间的关系,你的任务是用最少的努力将他们全部团结起来。
输入格式:
首先在第一行给出两个正整数 n 和 m(均不超过 105),分别为总人数和人与人之间的关系条数。接下来 m 行,每行描述了两个人之间的关系,格式为:
P1 P2 力量值
其中 P1
和 P2
是两个人的编号(所有人从 1 到 n 编号),力量值
是区间 [−103,103] 内的一个非零整数,其为正数时,表示 P1
和 P2
是朋友,这个值是他们团结起来的力量;其为负数时,表示 P1
和 P2
还没有成为朋友,这个值的绝对值是团结他们所需要付出的力量。
此外,如果我们想要将 A 和 B 团结起来,但他们之间的关系并没有给出,则假设团结他们需要付出的力量是个常数 104。
输出格式:
根据输入的人际关系,所有人可以被划分为几个朋友群。一个朋友群的“凝聚力”被定义为这个群中所有朋友间最小的力量值。首先必须在一行中按以下格式输出这些朋友群的信息:
G1-S1 G2-S2 …
其中 Gi
是朋友群的编号,即该群成员的最小编号;Si
是该群的凝聚力。按凝聚力的非递增序输出。当凝聚力并列时,按群规模(即群成员人数)的非递增序输出。如果还是并列,则按群编号的增序输出。一对数据之间用1个空格分隔,行首尾不得有多余空格。
随后在下一行输出将所有人全部团结起来需要的最小力量值。
输入样例:
10 13
8 3 -5
8 6 3
2 5 2
1 8 -1
3 5 -7
7 9 4
9 4 5
7 3 -3
4 3 -4
6 1 2
8 2 -6
7 4 2
6 3 -2
输出样例:
1-2 4-2 2-2 3-0 10-0
10011