hdu2236

链接:点击打开链接

题意:在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里而且要求这n个数中的最大值和最小值的差值最小

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int s[105][105],match[105],vis[105];
int n,p,low,high,mid,minn,maxx;
int dfs(int x){
    int i;
    for(i=1;i<=n;i++){
        if(s[x][i]>=p&&s[x][i]<=p+mid&&!vis[i]){
            vis[i]=1;
            if(!match[i]||dfs(match[i])){
                match[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int hungarian(){
    int i;
    memset(match,0,sizeof(match));
    for(i=1;i<=n;i++){
    memset(vis,0,sizeof(vis));
    if(!dfs(i))
    return 0;
    }
    return 1;
}                                       //匈牙利算法模板
int main(){                             //要求不同行不同列因此用到二分图最大匹配看是否全部的
    int t,i,j,sign;                     //数据在指定区间中
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        memset(s,0,sizeof(s));
        maxx=-1;minn=99999999;
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            scanf("%d",&s[i][j]);
            maxx=max(maxx,s[i][j]);
            minn=min(minn,s[i][j]);
        }
        high=maxx-minn;low=0;           //二分差值的大小
        while(low<high){
            sign=0;
            mid=(low+high)/2;
            for(p=minn;p+mid<=maxx;p++){//看是否完美匹配时全部数据满足在[p,p+mid]范围内
                if(hungarian()){
                    sign=1;
                    break;
                }
            }
            if(sign)
            high=mid;                   //满足时则改变high值看能否继续满足更小的区间
            if(!sign)
            low=mid+1;
        }
        printf("%d\n",high);
    }
    return 0;
}

??

时间: 2024-12-18 00:23:16

hdu2236的相关文章

hdu2236 无题II 最大匹配 + 二分搜索

中文题目,题意大家都明白. 看到“不同的行和列”就觉得要用二分匹配来做.要求最大值与最小值的差值最小,是通过枚举边的下限和上限来完成. 枚举过程是这样的,在输入的过程可以记录下边权的最大值MAX和最小值MIN.那么他们的边权的差值的最大值为right = MAX -MIN ,最小值left =0.然后不断地增加边的下限,查找边权的差值,如果能得到完美匹配(匹配数等于n),那么就记录下这个差值.最后输出.这个搜索过程类似于最大流+二分搜索. 1 #include<iostream> 2 #inc

HDU-2236 无题II

选取不同列不同行的N个数...明摆着叫你二分匹配 二分答案,然后枚举边的范围并跑匈牙利,以此判断答案范围. #include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <fstream> #include <iostream> #define rep(i, l, r) for(i

hdu_2236

1 // hdu2236 2 // Graph Match binary search + enumeration + bipartite 3 // Dec.26 2014 4 5 #include <cstdio> 6 #include <cstring> 7 #include <algorithm> 8 9 #define MaxN 111 10 #define ACCEPT 11 12 int G[MaxN][MaxN], T, n, max_edge, min_