首页 > 代码库 > hdu_2236
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 11110 #define ACCEPT11 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 ACCEPT44 freopen("in.txt","r",stdin);45 #endif46 scanf("%d", &T);47 while(T--){48 // input , get the max num and min num49 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\n", r);79 }80 return 0;81 }
hdu_2236
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。