1004

来源:互联网 发布:淘宝改销量 编辑:程序博客网 时间:2024/05/20 21:48

二分 加 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;
}

原创粉丝点击