zoukankan      html  css  js  c++  java
  • 【匈牙利匹配】无题II HDU2236

       

    这是一道最大匹配+二分答案的题目。首先,二分差值,上下界为0和最大值与最小值的差。然后匈牙利算法求能否匹配,可以的话减小差值,不能的话增加差值。代码:

    #include<cstdio>
    #include<cstring>
    #define maxn 101
    int n,l,r,mid,p;
    int w[maxn][maxn];
    int match[maxn];
    bool vis[maxn];
    
    bool dfs(int u)
    {
    	for(int v=1;v<=n;v++)
    		if(w[u][v]>=p&&w[u][v]<=p+mid&&!vis[v])//由p和p+mid来决定选不选
    		{
    			vis[v]=1;
    			if(match[v]==-1||dfs(match[v]))
    			{
    				match[v]=u;return true;
    			}
    		}
    	return false;
    }
    
    bool maxmatch()//匈牙利算法
    {
    	memset(match,-1,sizeof match);
    	for(int i=1;i<=n;i++)
    	{
    		memset(vis,0,sizeof vis);
    		if(!dfs(i))return false;
    	}
    	return true;
    }
    int main()
    {int T;
    	scanf("%d",&T);
    	while(T--)
    	{
    		int mn=100,mx=0;
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=n;j++)
    				scanf("%d",&w[i][j]),
    				mn=(mn>w[i][j])?w[i][j]:mn,
    				mx=(mx<w[i][j])?w[i][j]:mx;
    		l=0,r=mx-mn;int res;
    		while(l<=r)//二分答案
    		{
    			mid=(l+r)>>1;bool f=false;
    			for(p=mn;p+mid<=mx;p++)//枚举p为取出的数中最小的一个,p+mid为最大的一个
    				if(maxmatch())
    				{
    					f=true;break;
    				}
    			if(f)res=mid,r=mid-1;
    			else l=mid+1;
    		}
    		printf("%d
    ",res);
    	}
    }
  • 相关阅读:
    使用Hibernate实现简单的增、改、删、查操作
    Hibernate 配置
    Win7/8下Oracle的安装
    Android从相册获取图片
    Android图片缓存分析(一)
    TextView淡入淡出效果
    Android动画全解
    ListView的getChildAt(i)方法
    AIDL小记
    自定义SeekBar的Thumb不对齐的解决方法。
  • 原文地址:https://www.cnblogs.com/Orz-IE/p/12039522.html
Copyright © 2011-2022 走看看