二分图_HDU_2236

来源:互联网 发布:淘宝客邮件推广 编辑:程序博客网 时间:2024/06/05 16:23

心好累,wa成狗,推代码重写过了
选择行列,二分图的性质,选择匹配
要差值最大
二分答案,枚举最小值
为何区间不是成功向上移而是失败向上移呢?[ma,ma+ans]的区块,如果匹配不到,说明范围太小,加大ans,故上移,

#include<iostream>#include<cstring>#include<cstdio>const int maxn = 105;using namespace std;int map[maxn][maxn],n;int Max, Min,l,r,ma,mid;int link[maxn],vis[maxn];int Find(int x){    for(int i = 1; i <= n; i++)    {        if(!vis[i]&&map[x][i]>=ma&&map[x][i]<=ma+mid)        {            vis[i] = 1;            if(link[i]==-1||Find(link[i]))            {                link[i] = x;                return 1;            }        }    }    return 0;}int can(){    memset(link, -1,sizeof(link));    for(int i = 1; i <= n; i++)    {        memset(vis, 0, sizeof(vis));        if(!Find(i))            return 0;    }    return 1;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        Max = -101;Min = 100;        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%d",&map[i][j]);                if(map[i][j]>Max)Max = map[i][j];                if(map[i][j]<Min)Min = map[i][j];            }        }        l = 0;r = Max - Min;        while(1)        {            bool flag = false;            mid = (l+r)>>1;            for(ma = Min; ma+mid<=Max; ma++)            {                if(can())                {                    flag = true;                    break;                }            }            if(l == mid)break;            if(!flag)                l = mid;            else                r = mid;        }        printf("%d\n",r);    }    return 0;}
0 0
原创粉丝点击