思路:
直接贪心
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int n, m, k;
int a[100100], b[100100], c1[100100], c2[100100];
int fa[100100];
int find(int x)
{
if(fa[x]==x)
return x;
return fa[x]=find(fa[x]);
}
bool check(int maxn)
{
for(int i=1; i<=n; i++)
fa[i]=i;
int js=0, js1=0;
for(int i=1; i<=m&&js1<k; i++)
{
int fx=find(a[i]), fy=find(b[i]);
if(fx==fy)
continue;
if(c1[i]<=maxn)
js++, js1++, fa[fx]=fy;
}
if(js1<k)
return 0;
for(int i=1; i<=m&&js<n-1; i++)
{
int fx=find(a[i]), fy=find(b[i]);
if(fx==fy)
continue;
if(c2[i]<=maxn)
js++, fa[fx]=fy;
}
return js==n-1;
}
int main()
{
scanf("%d%d%d", &n, &k, &m);
for(int i=1; i<=m; i++)
scanf("%d%d%d%d", &a[i], &b[i], &c1[i], &c2[i]);
int l=0, r=30000, ans=1e9;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
r=mid-1, ans=min(ans, mid);
else
l=mid+1;
}
printf("%d", ans);
return 0;
}