zoukankan      html  css  js  c++  java
  • bzoj 2654 tree

    bzoj 2654 tree

    Description

    给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
    题目保证有解。

    Input

    第一行V,E,need分别表示点数,边数和需要的白色边数。
    接下来E行,每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。

    Output

    一行表示所求生成树的边权和。
    V<=50000,E<=100000,所有数据边权为[1,100]中的正整数。

    这道题怎么给人一种乱搞的感觉?但是解法十分神奇.这道题的单调性是不怎么明显的,首先它是要我们建一棵最小生成树,但我们并不会控制白边的数量.于是我们考虑到克鲁斯卡尔最小生成树算法中边权小的优先添加的特点.于是我们想到可不可以通过改变白边权值的大小来控制白边的数量.那么我们就给白边都加上一个数(x)((x)可以为负),通过二分枚举这个数(x)来控制白边的数量,于是正解就出来了.最后答案就是跑出来的最小生成树的权值和减去需要的白边树与我们枚举的(x)的积.

    代码如下

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    static const int maxm=1e6+10;
    
    struct Edge{
        int x,y,v,col;
        bool operator < (const Edge &E) const{
    	return v==E.v?col<E.col:v<E.v;
        }
    }edge[maxm];
    
    int ftr[maxm],u[maxm],v[maxm],val[maxm],col[maxm];
    int tot,ans,k,cnt,n,m,chk;
    
    int find(int x){
        return x==ftr[x]?x:ftr[x]=find(ftr[x]);
    }
    
    bool Kruskal(int x){
        tot=0;cnt=0;chk=0;
        for(int i=1;i<=n;i++)ftr[i]=i;
    
        for(int i=1;i<=m;i++){
    		edge[i].x=u[i];edge[i].y=v[i];edge[i].v=val[i];edge[i].col=col[i];
    		if(!col[i])edge[i].v+=x;
        }
    
        sort(edge+1,edge+m+1);
    
        for(int i=1;i<=m;i++){
    		int dx=find(edge[i].x);
    		int dy=find(edge[i].y);
    		if(dx!=dy){
    	    	ftr[dx]=dy;
    	    	tot+=edge[i].v;
    	    	cnt++;
    	    	if(!edge[i].col)chk++;
    		}
    		if(cnt==n-1)break;
        }
        
        if(chk<k)return false;
        return true;
    }
    
    int main(){
        scanf("%d%d%d",&n,&m,&k);
    
        for(int i=1;i<=m;i++)
    	scanf("%d%d%d%d",&u[i],&v[i],&val[i],&col[i]),
    	    u[i]++,v[i]++;
    
        int l=-11111,r=11111;
    
        while(l<=r){
    		int mid=(l+r)>>1;
    		if(Kruskal(mid))l=mid+1,ans=tot-k*mid;
    		else r=mid-1;
        }
    
        printf("%d
    ",ans);
        
        return 0;
    }
    

    点我进入AC通道

  • 相关阅读:
    CSS3实现投影效果
    @font-face使用在线字体
    JS全局对象的属性
    const命令声明变量应注意的几点
    IDEA设置不区分大小写提示
    分布式ID生成-雪花算法
    项目Git分支管理规范
    IDEA使用Mybatis插件 MyBatisCodeHelper-Pro
    解决码云出现git@gitee.com: Permission denied (publickey).
    安装RabbitMQ,一直提示Erlang版本过低
  • 原文地址:https://www.cnblogs.com/Exbilar/p/6657777.html
Copyright © 2011-2022 走看看