1 #include<cstring>
2 #include<vector>
3 #define MAX_V 80
4
5 int V; //顶点数
6 int match[MAX_V]; //所匹配的顶点
7 bool used[MAX_V]; //DFS中用到 的访问标记
8 vector<int> G[MAX_V]; //图的邻接表表示
9
10 //向图中增加一条边接u和v的边
11 void add_edge(int u,int v)
12 {
13 G[u].push_back(v);
14 G[v].push_back(u);
15 }
16
17 //通过DFS寻找增广路
18 bool dfs(int v)
19 {
20 used[v]=true;
21
22 for(int i=0;i<G[v].size();i++)
23 {
24 int u=G[v][i],w=match[u];
25 if(w<0||(!used[w]&&dfs(w)))
26 {
27 match[v]=u;
28 match[u]=v;
29 return true;
30 }
31 }
32
33 return false;
34 }
35
36 //求解二分图的最大匹配
37 int bipartite_matching()
38 {
39 int res=0;
40
41 memset(match,-1,sizeof(match));
42
43 for(int v=1;v<=V;v++)
44 {
45 if(match[v]<0)
46 {
47 memset(used,false,sizeof(used));
48 if(dfs(v))
49 res++;
50 }
51 }
52
53 return res;
54 }