1 条题解

  • 0
    @ 2025-10-8 17:06:43
    #include <bits/stdc++.h>
    using namespace std;
    const int N=50005,M=100005;
    int fa[N],n,m,need;
    struct edge{int u,v,w,c;}e[M];
    bool CMP(edge a,edge b){return (a.w==b.w)? a.c<b.c:a.w<b.w;}
    inline int findfa(int x){return (fa[x]==x)? x: fa[x]=findfa(fa[x]);}
    int sum,ans,temp,cnt=0;
    int main()
    {
    	scanf("%d%d%d",&n,&m,&need);
    	for(int i=1;i<=m;i++){
    		scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].w,&e[i].c);
    		e[i].u++;e[i].v++; 
    	}
    	int l=-114,r=114;
    	while(l<=r)
    	{
    		int mid=(l+r)>>1;
    		for(int i=1;i<=m;i++)if(e[i].c==0)e[i].w+=mid;
    		for(int i=1;i<=n+1;i++)fa[i]=i;
    		sum=0,cnt=0,temp=0;
    		sort(e+1,e+1+m,CMP);
    		for(int i=1;cnt!=n-1;i++)
    		{
    			int xx=findfa(e[i].u),yy=findfa(e[i].v);
    			if(xx!=yy){
    				cnt++;
    				fa[xx]=yy;
    				if(e[i].c==0) temp++;
    				sum+=e[i].w;
    			} 
    		}
    		if(temp>=need)l=mid+1,ans=sum-need*mid;
    		else          r=mid-1;
    		for(int i=1;i<=m;i++)if(e[i].c==0)e[i].w-=mid;
    	}
    	printf("%d",ans);
    	return 0;
    }
    
    • 1

    *【最小生成树:灵活】[国家集训队] Tree I

    信息

    ID
    4319
    时间
    2000ms
    内存
    512MiB
    难度
    9
    标签
    递交数
    16
    已通过
    4
    上传者