• 图论训练之十二


    bzOJ2654: tree

    Description

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

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

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

    2 2 1
    0 1 1 1
    0 1 2 0
    Sample Output

    2

    复习一下wqs二分

    思路:wqs二分
    显而易见,这是一道最小生成树......
    但是问题在于其中有黑白边及白边大小上的要求。

    根据kruskal的做法,我们发现选边的优先极取决于边权

    如果我们能够将白边的边权进行扩大(缩小),那么就可以做到控制白边数量了。

    接着,思考:当把所有白边都加上一个偏移量offset之后,可以求出一棵最小生成树,

    再将答案减去树中所有白边的数量*offset,其实这就是一种合法的生成树。
    offset过大导致选择的白边太少反之则太多

    我们发现白边数量随offset的递增而递增,因此我们可以二分答案,二分offset的大小求解

    code:
    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int MAXE=100010;
    struct edge
    {
    	int u,v,w,c;
    }E[MAXE];
    int v,e,need,wn,ans,tot;
    int f[MAXE/2];
    int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
    bool cmp(edge a,edge b){return a.w==b.w?a.c<b.c:a.w<b.w;}
    int kruskal(int add)
    {
    	for(int i=1;i<=v;i++)f[i]=i;
    	for(int i=1;i<=e;i++)
    		if(!E[i].c)E[i].w+=add;
    	sort(E+1,E+1+e,cmp);
    	int cnt=0,w=0;tot=0;
    	for(int i=1;i<=e;i++)
    	{
    		if(find(E[i].u)!=find(E[i].v))
    		{
    			f[find(E[i].u)]=find(E[i].v);
    			cnt++;tot+=E[i].w;
    			if(!E[i].c)w++;
    		}
    		if(cnt==v-1)break;
    	}
    	for(int i=1;i<=e;i++)
    		if(!E[i].c)E[i].w-=add;
    	return w;
    }
    int main()
    {
    	cin>>v>>e>>need;
    	for(int i=1;i<=e;i++)
    	{
    		cin>>E[i].u>>E[i].v>>E[i].w>>E[i].c;
    		E[i].u++;E[i].v++;
    		if(!E[i].c)wn++;
    	}
    	int l=-100,r=100;
    	while(l<r)
    	{
    		int mid=(l+r)>>1;
    		if(kruskal(mid)>=need){l=mid+1;ans=tot-wn*mid;}
    		else r=mid-1;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    centos 7.0 yum 分开安装 LAMP 环境 +zabbix3.4环境
    互联网产品接入支付功能如何测试?
    python实现:将文本文件分割成多个小文本文件(php也可实现)
    『危机领导力』告诉我们如何带好团队
    Fiddler显示服务器IP的方法
    Google PageSpeed Tools 性能测试分析
    写给浮躁的测试工程师一封信
    数据库事务和锁
    测试工作中ADB命令实战
    git使用基础
  • 原文地址:https://www.cnblogs.com/wzxbeliever/p/11714089.html
Copyright © 2020-2023  润新知