zoukankan      html  css  js  c++  java
  • 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_edge, l, r, mid, enum_edge, gx[MaxN], gy[MaxN];
    13 bool vis[MaxN], is_match;
    14 
    15 bool dfs(int u)
    16 {
    17     for(int i = 1; i <= n; ++i){
    18         if(G[u][i] >= enum_edge && G[u][i] <= enum_edge + mid && vis[i] == false){
    19             vis[i] = true;
    20             if(gy[i] == -1 || dfs(gy[i]) == true){
    21                 gy[i] = u;
    22                 gx[u] = i;
    23                 return true;
    24             }
    25         }
    26     }
    27     return false;
    28 }
    29 
    30 bool hungry()
    31 {
    32     memset(gx, -1, sizeof(gx));
    33     memset(gy, -1, sizeof(gy));
    34     for(int i = 1; i <= n; ++i){
    35         memset(vis, false, sizeof(vis));
    36         if(dfs(i) == false)
    37             return false;
    38     }
    39 }
    40 
    41 int main(int argc, char const *argv[])
    42 {
    43     #ifndef ACCEPT
    44         freopen("in.txt","r",stdin);
    45     #endif
    46     scanf("%d", &T);
    47     while(T--){
    48         // input , get the max num and min num
    49         max_edge = -1;
    50         min_edge = 101;
    51         scanf("%d", &n);
    52         for(int i = 1; i <= n; ++i){
    53             for(int j = 1; j <= n; ++j){
    54                 scanf("%d", &G[i][j]);
    55                 max_edge = std::max(G[i][j], max_edge);
    56                 min_edge = std::min(G[i][j], min_edge);
    57             }
    58         }
    59         // 
    60         l = 0;
    61         r = max_edge - min_edge;
    62         while(true){
    63             mid  = (l + r) >> 1;
    64             is_match = false;
    65             for(enum_edge = min_edge; enum_edge + mid <= max_edge; ++enum_edge){
    66                 if(hungry() == true){
    67                     is_match = true;
    68                     break;
    69                 }
    70             }
    71             if(is_match == true)
    72                 r = mid;
    73             if(l == mid)
    74                 break;
    75             if(is_match == false)
    76                 l = mid;
    77         }
    78         printf("%d
    ", r);
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    C++ 类的本质 札记
    eclipse makefile
    boost 简介
    telecom 产品分析js
    javascript 得到页面参数
    ajax 接口统一模式
    备份
    jquery 元素插入详解
    使用WebClient制作一下简单的采集器
    数据库锁机制
  • 原文地址:https://www.cnblogs.com/takeoffyoung/p/4190411.html
Copyright © 2011-2022 走看看