1 /*
2 题意:二分图匹配
3 题解:
4 时间:2018.07.18
5 */
6
7 #include <bits/stdc++.h>
8 using namespace std;
9
10 typedef long long LL;
11 const int MAXN = 100005;
12 const LL MOD7 = 1e9+7;
13
14 struct Edge
15 {
16 int u,v;
17 int next;
18 }edge[2*MAXN];
19
20 int head[MAXN];
21 int cnt;
22
23 int mark[MAXN];
24 int n,m;
25 int vis[MAXN];
26
27 void init()
28 {
29 cnt=0;
30 memset(head,-1,sizeof(head));
31 }
32
33 void addEdge(int u,int v)
34 {
35 edge[cnt].u=u;edge[cnt].v=v;edge[cnt].next=head[u];head[u]=cnt++;
36 }
37
38 bool dfs(int u)
39 {
40 for (int i=head[u];i!=-1;i=edge[i].next)
41 {
42 int v=edge[i].v;
43 if (vis[v]) continue;
44 vis[v]=1;
45 if (mark[v]==-1 || dfs(mark[v]))
46 {
47 mark[v]=u;
48 return true;
49 }
50 }
51 return false;
52 }
53
54 void work()
55 {
56 int ans=0;
57 memset(mark,-1,sizeof(mark));
58 for (int i=1;i<=n;++i)
59 {
60 memset(vis,0,sizeof(vis));
61 ans+=dfs(i);
62 }
63 printf("%d\n",ans/2);
64 }
65
66 int main()
67 {
68 #ifndef ONLINE_JUDGE
69 freopen("test.txt","r",stdin);
70 #endif // ONLINE_JUDGE
71 scanf("%d%d",&n,&m);
72 int u,v;
73 init();
74 for (int i=1;i<=m;++i)
75 {
76 scanf("%d%d",&u,&v);
77 addEdge(u,v);
78 addEdge(v,u);
79 }
80 work();
81 return 0;
82 }