【洛谷 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 }