题意:
有N个点,M条边,要生成一颗树。使得边权最小,而且对于起点 1 有度限制(k)。如果可以,输出所选边,否则输出 -1.
这道题可以用度限制最小生成树来做,但是这道题和度限制最小生成树又有区别,这里要求根节点的度必须为K。而后者要求小于等于K的最小值。
所以这道题目可以采用二分来实现。
采用krusical来做最小生成树的时候,每次挑选最小可行边加入集合,所以可以预处理一下与根节点相连的边,变为 w[i] ' = mid + w[i].
通过二分mid,每次求最小生成树的时候记录与1结点相连的边数。
/*
ID: [email protected]
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#define maxn 5500
#define maxm 100100
#define INF (1<<30)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define For(i,