• 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 }
  • 相关阅读:
    Sum Root to Leaf Numbers
    Sum Root to Leaf Numbers
    Sort Colors
    Partition List
    Binary Tree Inorder Traversal
    Binary Tree Postorder Traversal
    Remove Duplicates from Sorted List II
    Remove Duplicates from Sorted List
    Search a 2D Matrix
    leetcode221
  • 原文地址:https://www.cnblogs.com/takeoffyoung/p/4190411.html
Copyright © 2020-2023  润新知