首页 > 其他 > 详细

hihoCoder#1121 二分图一?二分图判定

时间:2015-04-08 00:38:45      阅读:444      评论:0      收藏:0      [点我收藏+]

原题地址

 

只能说匈牙利算法不能更屌,而且提示里给的伪码也不能更屌了!

只用了第二个优化,因为将输入点集分割成A、B似乎挺麻烦的,索性就没用这个优化。

 

代码:

 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 #define MAX_VERTEX 1024
 7 
 8 int N, M;
 9 
10 bool g[MAX_VERTEX][MAX_VERTEX];
11 int m[MAX_VERTEX]; // match[vi] = ui 表示vi节点匹配的节点是ui
12 bool c[MAX_VERTEX]; // cover[vi] = true or false 表示vi节点是否已经被查询过了
13 
14 bool findPath(int u) {
15   for (int i = 1; i <= N; i++) {
16     if (!g[u][i] || c[i])
17       continue;
18     c[i] = true;
19     if (!m[i] || findPath(m[i])) {
20       m[u] = i;
21       m[i] = u;
22       return true;
23     }
24   }
25   return false;
26 }
27 
28 int solve() {
29   int res = 0;
30 
31   for (int i = 1; i <= N; i++) {
32     memset(c, 0, sizeof(c));
33     if (!m[i] && findPath(i))
34       res++;
35   }
36 
37   return res;
38 }
39 
40 int main() {
41   memset(g, 0, sizeof(g));
42   memset(m, 0, sizeof(m));
43   scanf("%d%d", &N, &M);
44   for (int i = 0; i < M; i++) {
45     int u, v;
46     scanf("%d%d", &u, &v);
47     g[u][v] = g[v][u] = true;
48   }
49   printf("%d\n", solve());
50   return 0;
51 }

 

hihoCoder#1121 二分图一?二分图判定

原文:http://www.cnblogs.com/boring09/p/4400911.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!