二分 加 kruskal 结果错误 伤不起啊
# include<cstdio>
# include<algorithm>
# include<cstring>
# define maxe 100010
using namespace std;
int a[maxe],b[maxe],c[maxe];
int value[maxe],w[maxe],cc[maxe];
int n,m,r,sum=0;
int vis[10000],fa[10000];
int cmp1(const int a,const int b)
{
return value[a]<value[b];
}
int cmp2(const int a,const int b)
{
return c[a]<c[b];
}
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int test(int mv)
{
int num=2;
for(int i=0;i<m;i++)
{
int u=a[w[i]];
int v=b[w[i]];
if(find(u)!=find(v)&&c[w[i]]>=mv&&sum+value[w[i]]<=r)
{
if(!vis[u])
{
vis[u]=1;
num++;
}
if(!vis[v])
{
vis[v]=1;
num++;
}
u=fa[fa[v]];
sum+=value[w[i]];
}
}
if(num>=n&&sum<=r)
return 1;
return 0;
}
int main()
{
while(scanf("%d %d %d",&n,&m,&r)!=EOF)
{
int i,j,v,k=-1;
for(i=0;i<m;i++)
{
scanf("%d %d %d %d",&a[i],&b[i],&value[i],&c[i]);
w[i]=i;
cc[i]=i;
}
sort(w,w+m,cmp1);
sort(cc,cc+m,cmp2);
int l=0,r=m-1,mid;
while(l<=r)
{
mid=(l+r)/2;
sum=0;
for(i=0;i<n;i++)
fa[i]=i;
memset(vis,0,sizeof(vis));
sum+=value[cc[mid]];
vis[a[cc[mid]]]=1;
vis[b[cc[mid]]]=1;
fa[a[cc[mid]]]=b[cc[mid]];
if(test(c[cc[mid]]))
{
k=c[cc[mid]];
l=mid+1;
}
else
r=mid-1;
}
printf("%d\n",k);
}
return 0;
}