【洛谷 p3386】模板-二分图匹配(图论)

题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数。

解法:匈牙利算法。(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配。若对方已有匹配的对象,就让那个对象尽量调整来使自己这对能凑起来。而要注意,每次问过的对象就不要再问了,也就是不要让它的对象总是换来换去......

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 
 7 const int N=1010,M=1010;
 8 int n,m,e;
 9 int vis[N][N];
10 int ask[M],cp[M];
11 
12 bool ffind(int x)
13 {
14     for (int i=1;i<=m;i++)
15       if (vis[x][i])
16       {
17         if (ask[i]) continue;
18         ask[i]=1;
19         if (!cp[i]||ffind(cp[i]))
20         {cp[i]=x;return true;}
21       }
22     return false;
23 }
24 void getmatch()
25 {
26     int ans=0;
27     memset(cp,0,sizeof(cp));
28     for (int i=1;i<=n;i++)
29     {
30       memset(ask,0,sizeof(ask));
31       if (ffind(i)) ans++;
32     }
33     printf("%d\n",ans);
34 }
35 int main()
36 {
37     scanf("%d%d%d",&n,&m,&e);
38     for (int i=1;i<=e;i++)
39     {
40       int x,y;
41       scanf("%d%d",&x,&y);
42       vis[x][y]=1;
43     }
44     getmatch();
45     return 0;
46 }

 

posted @ 2016-11-18 11:00  konjac蒟蒻  阅读(229)  评论(0编辑  收藏  举报