题目描述
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
https://www.luogu.org/problemnew/show/P2619
输入输出格式
输入格式:
第一行V,E,need分别表示点数,边数和需要的白色边数。
输出格式:
一行表示所求生成树的边权和。
说明
0:V<=10
1,2,3:V<=15
0,…,19:V<=50000,E<=100000
所有数据边权为[1,100]中的正整数。
接下来E行
每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。
首先,分析这道题,是一个关于最小生成树的问题,由于顶点数是50000,我们肯定不能用邻接矩阵,考虑邻接表。
然后,就很容易想到是要跑克鲁斯卡尔啦。
int find(int x) {
return f[x]==x?x:f[x]=find(f[x]);}
void kruskal(){
for(int i=1;cnt!=n-1;++i){
int r1=find(edge[i].start),r2=find(edge[i].end);
if(r1!=r2) {
f[find(r1)]=find(r2),cnt++;
if(edge[i].c==0) temp++