2019ICPC-南昌- E. Bob’s Problem
做法:黑边选完,再选白边。没什么好说的。。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn= 1e6 + 7 ;
struct edge
{
int u, v, w, id;
bool operator < ( edge a) const {
return w> a. w;
}
} e[ maxn] ;
int fa[ maxn] , n, m, k, vis[ maxn] ;
int findfa ( int x)
{
return fa[ x] = ( fa[ x] == x? x: findfa ( fa[ x] ) ) ;
}
int eurl ( )
{
int cnt= 0 , ans= 0 , num= 0 ;
for ( int i= 1 ; i<= m; i++ ) {
int u= e[ i] . u, v= e[ i] . v, w= e[ i] . w;
if ( e[ i] . id== 1 ) continue ;
ans+ = w;
int fu= findfa ( u) , fv= findfa ( v) ;
if ( fu!= fv) {
fa[ fu] = fv;
cnt++ ;
}
}
for ( int i= 1 ; i<= m; i++ ) {
int u= e[ i] . u, v= e[ i] . v, w= e[ i] . w;
if ( e[ i] . id== 0 ) continue ;
int fu= findfa ( u) , fv= findfa ( v) ;
if ( fu!= fv) {
fa[ fu] = fv;
cnt++ ;
ans+ = w;
num++ ;
vis[ i] = 1 ;
if ( num>= k) {
return cnt== n- 1 ? ans: - 1 ;
}
}
}
for ( int i= 1 ; i<= m; i++ ) {
if ( e[ i] . id== 1 && num< k) {
if ( vis[ i] == 0 ) ans+ = e[ i] . w, num++ ;
}
}
return cnt== n- 1 ? ans: - 1 ;
}
signed main ( ) {
long long l, r, s;
int t;
scanf ( "%lld" , & t) ;
while ( t-- ) {
scanf ( "%lld%lld%lld" , & n, & m, & k) ;
for ( int i= 1 ; i<= n; i++ ) {
fa[ i] = i;
vis[ i] = 0 ;
}
for ( int i= 1 ; i<= m; i++ ) {
int a, b, c, d;
scanf ( "%lld%lld%lld%lld" , & a, & b, & c, & d) ;
e[ i] = edge{ a, b, c, d} ;
}
sort ( e+ 1 , e+ 1 + m) ;
int ans= eurl ( ) ;
printf ( "%lld\n" , ans) ;
}
return 0 ;
}